我有大量的数据矩阵存储在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:红色
然后,按上述分析继续。只用这些单词替换数字
因此,第二列中的结果将是数字以外的单词。
很抱歉将我的问题放在答案框中,但我无法发表评论
这个问题..
答案 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)];
希望我在某个地方没有犯错误。
它可能无需创建组合矩阵即可解决。但是你的矩阵很小,不应该有任何内存或性能相关的问题。