矩阵提取和分配数字或符号

时间:2010-10-31 23:29:55

标签: matlab matrix label

我有大量的数据矩阵存储在MATLAB M文件中,我将解释

我的问题来自这个示例:

我有三个常数矩阵(每个矩阵都有自己的值和这些

值不会更改,它们是实验结果的值)

每个矩阵总是有4行和6列

第一个矩阵的最后一列是零列

第二个矩阵没有任何零列

第3个矩阵的最后2列是零

实际上,我还有其他矩阵,但上面只是样本,意思是

我的数据中接下来的三个矩阵不必与

的序列相同 在具有或不具有零列的情况下

以上三个矩阵。另一点是

非零列始终位于最后三个或两个或一列中,或者没有

零列。

所以,我需要从上面的矩阵中分配三个字母x,y和z OR

仅从非零列开始的数字5,6和7,从

的第1列开始

矩阵1继续到最后一个矩阵的最后一列,不包括零列

意思是:上面的例子结果将是:

第一个矩阵:

第1栏:5

第2栏:6

第3栏:7

第4栏:5

第5列:6

第6列:排除且未编号,因为它是零列

然后它不会重置计数,但会连续标记并跳转到

下一个矩阵,所以:

第二个矩阵

第1列:7

第1栏:5

继续到最后一个矩阵。

我正在使用Matlab窗口中显示的以下命令:

K =输入('输入矩阵编号:1或2或3')

然后,在输入矩阵编号后,程序会要求用户

输入列号:

M =输入('输入列号1或2或3或4或5或6')

然后,结果将是两列的矩阵:

第1列:输入数字的列元素

第二列:指定的数字5 OR 6 OR 7到此列,并且肯定是

在专栏中重复。

对于这个长期的问题感到抱歉,我也试着总结并尽可能地简化。

我感谢任何帮助和感谢。


我可以问一个问题继续上述吗?

如果有人想通过文字表示数字,是否可以?

这意味着,例如:

5:绿色

6:蓝色

7:红色

然后,按上述分析继续。只用这些单词替换数字

因此,第二列中的结果将是数字以外的单词。

很抱歉将我的问题放在答案框中,但我无法发表评论

这个问题..

1 个答案:

答案 0 :(得分:2)

我希望你把所有的矩阵保存在一个变量中。它允许您不要为不同的矩阵重复相同的命令或使用eval

假设您有3个矩阵:

% sample data
A1 = horzcat(rand(4,5),zeros(4,1));
A2 = rand(4,6);
A3 = horzcat(rand(4,4),zeros(4,2));

您可以将它们组合为单元格数组:

A = {A1,A2,A3};

或3D数组(因为所有矩阵都具有相同的大小):

A = cat(3,A1,A2,A3);

创建具有4行和(6 + 6 + 6)列的组合矩阵B

% combined matrix for cell array
B = cell2mat(A);

% or for 3D array
B = reshape(A,4,[]);

然后你可以使用以下代码用5 6和7重新填充B:

% repopulate B with 5, 6, 7
zerocolumns = all(B==0,1); % index of columns with all zeros
vec567 = repmat(5:7,1,ceil(sum(~zerocolumns)/3)); % vector 5 6 7 5 6 7 ...
B(:,~zerocolumns) = repmat(vec567(1:sum(~zerocolumns)),size(B,1),1);

将B拆分回原始矩阵:

% convert back to cell array
C = mat2cell(B,[],4, [6 6 6]);

% convert back to 3D array
C = reshape(B,4,6,[]);

最后,您可以获得2列输出

% cell arrays
result = [A{K}(:,M) C{K}(:,M)];

% 3D arrays
result = [A(:,M,K) C(:,M,K)];

如果您不需要重新填充原始矩阵,您可以提前得到结果:

% cell arrays
result = [A{K}(:,M) B(:,(K-1)*6+M)];

% 3D arrays
result = [A(:,M,K) B(:,(K-1)*6+M)];

希望我在某个地方没有犯错误。

它可能无需创建组合矩阵即可解决。但是你的矩阵很小,不应该有任何内存或性能相关的问题。