【问题标题】:Using a 'for loop' to iterate through a cell array使用“for 循环”遍历元胞数组
【发布时间】:2017-01-02 19:46:35
【问题描述】:

在 matlab 中,我有一个带有十六进制值的元胞数组块。

a = '40 C0 70 EB'; 
b = '40 C0 80 94'; 
c = '40 C0 90 59';
s = {a;b;c};

我想以这样的方式水平遍历每一行;

  1. 第一个字节 'EB' 必须转换为二进制(即 EB = 1110 1011 = 8 位)并保存在某个变量/数组中

  2. 然后,'EB & 70' 必须转换为二进制,但它们的二进制值必须一起存储(即 EB & 70 = 11101011 01110000 = 16 位)在某个变量/数组中。

    李>
  3. 同样,“EB & 70 & C0”在某些变量/数组中转换为二进制(即 EB & 70 & C0 = 11101011 01110000 11000000 = 24 位)。

  4. 类似地,'40 C0 70 EB'(即 40 & C0 & 70 & EB = 11101011 01110000 11000000 01000000 = 32 位)

  5. 最后,必须对其余的行执行相同的操作。

我已经编写了一个代码来将单个十六进制值转换为等效的二进制值,但我不知道如何从这里开始。

a = '40 C0 70 EB'; 
b = '40 C0 80 94'; 
c = '40 C0 90 59'; 

s = {a;b;c};

s = cellfun(@strsplit, s, 'UniformOutput', false);

s = vertcat(s{:}); 

dec = hex2dec(s);
bin = dec2bin(dec);
x=cellstr(bin);
bin = mat2cell(x, repmat(size(s,1),1,size(s,2)));    

关于如何完成这些壮举有什么建议吗?

【问题讨论】:

    标签: arrays matlab binary hex cell-array


    【解决方案1】:

    从您在问题中包含的代码来看,您似乎已经完成了大部分工作。

    我认为您缺少的这一点是如何连接二进制字,这在 Matlab 中有点尴尬。有关一些提示,请参阅this post。但是,对于您的示例,仅转换为字符串并连接的稍微有点 hack-y 的选项可能更容易。

    利用你的代码,下面的例子输出:

    '11101011'    '1110101101110000'    '111010110111000011000000'    '11101011011100001100000001000000'
    '10010100'    '1001010010000000'    '100101001000000011000000'    '10010100100000001100000001000000'
    '01011001'    '0101100110010000'    '010110011001000011000000'    '01011001100100001100000001000000'
    

    我认为这是您想要的,但从您的文字中并不能完全确定。我假设你想保留每行的所有 4 个数字(8 位、16 位、24 位和 32 位),所以总共有 12 个二进制字符串。

    a = '40 C0 70 EB'; 
    b = '40 C0 80 94'; 
    c = '40 C0 90 59'; 
    
    s = {a;b;c};
    s = cellfun(@strsplit, s, 'UniformOutput', false);
    s = vertcat(s{:});
    
    % Empty cell to store output binary strings;
    outputBinary = cell(size(s));
    outputDec = zeros(size(s));
    
    % Iterate over each row
    for rowNum = 1:size(s,1)
    
        % To build up binary string from left to right
        binaryString = [];
    
        % Iterate over each column
        for colNum = 1:size(s,2)
    
            % Convert hex -> dec -> 8-bit binary word
            % and add new word to end of growing string for this row
            thisBinary = dec2bin(hex2dec(s{rowNum,end+1-colNum}), 8);
            binaryString = [binaryString, thisBinary]; %#ok<AGROW>
    
            % Save solution to output array:
            outputBinary{rowNum, colNum} = binaryString;
            outputDec(rowNum, colNum) = bin2dec(binaryString);
        end
    end
    
    % Display result
    format long;
    disp(outputBinary);
    

    【讨论】:

    • 宾果游戏!谢谢你的回答。您能否在您的代码中提及如何将生成的二进制(OutputBinary)转换为十进制?
    • 如果你使用bin2dec(outputBinary),你应该得到一个包含十进制值的 [12 x 1] 数组。我已经编辑了答案以输出 [3 x 4] 矩阵以匹配 [3 x 4] 二进制字符串输出。
    • 太棒了!能否请您简要解释一下这一行的含义:thisBinary = dec2bin(hex2dec(s{rowNum,end+1-colNum}), 8);。特别是这部分:{rowNum,end+1-colNum}
    • 它从s 单元格中选择所需的十六进制数。 rowNum 选择当前行。 end+1-colNum 选择列,但从末尾开始,如在您的示例中,您希望从左到右读取数字。换句话说,在内部 for 循环中 colNum 进入 1、2、3、4 但 end+1-colNum 将选择 s 的第 4、3、2、1 列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2023-03-05
    • 2014-02-05
    相关资源
    最近更新 更多