如何在Matlab中引用一个数组的索引与来自另一个数组的所有值

时间:2015-02-04 03:53:18

标签: arrays matlab matrix

Matlab的新手,我正在尝试将二进制消息转换为Matlab中的字符。我能够将二进制消息转换为十进制的单个列(没有bin2dec函数,正如我所指示的那样),每个数字对应于字符串数组中的字符。

我无法让字符串数组在另一个数组的索引值处显示其值。它在我引用数组的各个索引时起作用(例如 message = char_array(decimal(1))返回值 k ),但是当我尝试引用时整列或整个十进制数组(例如 message = char_array(decimal(:,:)) message = char_array(decimal(:,1))不起作用并给出相同的错误)。我知道这可以用 for loops 完成,但是我们已经被指示不要使用它们。

还有其他一些技巧可以让整个消息一次显示出来吗?这需要以这样一种方式工作,即只需一行简单的代码即可同时使用数千个字母。

到目前为止的代码:

 clear;clc

 % Array of characters (first value is a space, last is ! which denotes the end of the message)

 char_array =  ' abcdefghijklmnopqrstuvwxyz!'; 

 % The secret message in binary

 secret =   [0 1 1 0 0;
             0 0 0 0 1; 
             1 0 0 0 0; 
             0 1 0 0 0;
             1 0 0 1 0;
             0 1 1 1 1;
             0 0 0 0 1;
             0 1 0 0 1;
             0 0 1 1 1;
             0 0 0 0 0;
             1 0 0 1 0;
             0 1 1 1 1;
             0 0 0 1 1;
             0 1 0 1 1;
             1 0 0 1 1;
             1 1 0 1 1];


 % Assigns a decimal value to each column to help convert binary values to decimal

 conv = [16 8 4 2 1]; 

 % Converts binary numbers in each column of secret message to a decimal value

 convert = [secret(:,1)*conv(1), secret(:,2)*conv(2), secret(:,3)*conv(3), secret(:,4)*conv(4), secret(:,5)*conv(5)]; 

 % Converts unadded decimal values into columns to prepare for addition

 binary = convert'; 

 % Adds numbers in each column, then transposes it to a single column of decimal values representing values of each row of original message

 decimal = sum(binary)'; 

 % Should display character from character array for each index value of "decimal", but returns "Subscript indices must either be real positive integers or logicals." error each time. Works for individual entries such as decimal(1), though.

 message = char_array(decimal(:,:))

2 个答案:

答案 0 :(得分:2)

我的代码很好。问题是 decimal 中的一个值为零,并且您不能引用数组值为零! :)

如果为 decimal 的每个值加1以补偿字符数组开头的空格,则会正确生成消息。

接近代码的底部:

% Adds numbers in each column, then transposes it to a single column of decimal values representing values of each row of original message

decimal = sum(binary)'; 

% Adds 1 to each value of "decimal"

decimal2 = decimal+1; 

message = char_array(decimal2(:,:))

正确解码消息。 (是的,Laphroaig确实摇滚!)

答案 1 :(得分:2)

基于

Fast matrix multiplication的通用紧凑型单线程解决方案技术 -

message = char_array(secret*(2.^(size(secret,2)-1:-1:0)')+1)