arrays - 在matlab中读取字符数组行

标签 arrays matlab char

我有什么

我有一个 char 数组,通过在两个 char 数组之间执行 strcat 来定义,如下所示:

coeficientes = strcat(coef_bin, coef_bin_comp)

然后,我想读取每一行并将它们转换为十六进制。我这样做是这样的:

for k=1:11

  coef_binario = coeficientes(1+(k-1)*8:k*8);

  coef_hexadecimal = binaryVectorToHex( coef_binario - '0' );

  fprintf('%s\t%s\n', coef_binario, coef_hexadecimal);

end

结果是什么

如果我打印 coeficientes 变量和要转换的每个 coef_binario,结果如下:

注意:coeficientes 是通过删除 strcat 行后的分号来打印的,但 coef_binario 是通过使用 fprintf 打印的,如上面所写。

coeficientes =

00011111 00111101 01001100 01011011 01111001 10001000 10010111
10110101 11000100 11010011 11110001

00000111     07      11100111     E7      00011101     1D 
00100100     24      11101101     ED      10111111     BF     
11000001     C1      11000111     C7      00100100     24     
10010110     96      11011011     DB

问题

如您所见,我尝试使用以下方法逐行读取coeficientes var:

coef_binario = coeficientes(1+(k-1)*8:k*8);

但是当打印出来时,二进制代码与原始代码不匹配。知道为什么或者如何才能正确地做到这一点吗?

更新 1

如果我尝试在执行此操作之前对其进行拆分,以便在需要获取字符串之前使用strsplit。我试过:

strs = strsplit(sprintf('%s', coeficientes), ' ')

由此,我再次获得错误链。事实上,在仅使用 sprintf (而不是 strsplit)后,我得到的是:

0000011111100111000111010010010011101101101111111100000111000111001001001001011011011011

更新 2

如何生成coeficientes:

% coef_k is a vector of decimal numbers, i.e.: [1 3 5 8 11 14]
coef_bin = dec2bin(coef_k);
coef_complementario = 16 - coef_k;

coef_bin_comp = dec2bin(coef_complementario);

coeficientes = strcat(coef_bin, coef_bin_comp)

最佳答案

直接的问题是 MATLAB 按列优先顺序存储数据,因此本质上发生的情况是,如果您的数据是 2D 字符数组(dec2bin 的输出):

c = ['00011111'
     '00111101'
     '01001100'
     '01011011'
     '01111001'
     '10001000'
     '10010111'
     '10110101'
     '11000100'
     '11010011'
     '11110001'];

然后,当您使用诸如 1+(k-1)*8:k*8 这样的线性索引时,它会沿着列读取,而不是像这样跨行读取你想要的。

例如,对于k = 1:

k = 1;
c(1+(k-1)*8:k*8)
% 00000111  <---- Clearly not the first row. It is the first 8 entries going
%                 down the first column.

您有四个选择:

  1. 在处理之前转置 c(以使数字沿着列向下移动):

    c = c.';
    
    k = 1;
    c(1+(k-1)*8:k*8)
    % 00011111 <---- The first row like you would expect!
    
  2. 调整索引表达式以跨列

    k = 1;
    c(k:size(c,1):end)
    % 00011111 <---- The first row like you would expect!
    
  3. 只需使用普通矩阵索引即可获取一行

    k = 1;
    c(k,:)
    % 00011111 <---- The first row like you would expect!
    
  4. 只需使用内置的 bin2dec 后跟 dec2hex 即可获取十六进制表示形式。如果您将二维字符数组传递给 bin2dec,它会将每个解释为不同的二进制数。

    hex = dec2hex(bin2dec(c));
    
        1F
        3D
        4C
        5B
        79
        88
        97
        B5
        C4
        D3
        F1
    

关于arrays - 在matlab中读取字符数组行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37364803/

相关文章:

java - for 循环中数组元素的减法 (java.lang.ArrayIndexOutOfBoundsException)

java - 为什么快速排序的 JDK 实现有堆栈溢出的风险?

c++ - 使用文件将 C++ 数组转换为 matlab 大矩阵

MATLAB - 将向量转换为单位向量

使用 MATLAB 和 C 将 .bin 转换为图像系数并创建二值图像

java - 取自文本文件 : index out of range 的字符数组

string - 如何将 char* 转换为 D 中的字符串?

java - 不同的按钮,相同的导航 Activity ,但导航 Activity 中 fragment 的结果不同

python - 使用 numpy 索引元组

c++ - 指针和将 char 数组转换为 int