我在MATLAB M文件中存储了巨大的数据矩阵,我将说明
通过此示例示例遇到的问题:
我有三个常数矩阵(每个矩阵都有自己的值,这些值
值未更改,它们是实验结果的值)
每个矩阵总是有4行6列
第一个矩阵的最后一列是零列
第二矩阵没有任何零列
第三矩阵的最后2列为零
实际上,我还有其他矩阵,但以上只是示例,这意味着
我数据中的下三个矩阵不必与序列相同
在具有或不具有零列的情况下,三个矩阵以上。还有一点是
非零列始终位于最后三列或两列或一列,或者没有
零列。
因此,我需要从上述矩阵中分配三个字母x,y和z或
数字5、6和7只能从非零列开始,从第1列开始
矩阵1继续到最后一个矩阵的最后一列(不包括零列)
意思是:上面的示例结果将是:
第一个矩阵:
第1列:5
专栏2:6
专栏3:7
第4列:5
第5列:6
第6列:由于为零列,已排除且未编号
然后,它不会重置计数,而是连续标记并跳转到
下一个矩阵,所以:
第二矩阵
第1栏:7
第1列:5
。
。
。
。
依此类推,直到最后一个矩阵。
我正在使用Matlab窗口中出现的以下命令:
K = input('输入矩阵编号:1 OR 2 OR 3')
然后,在输入矩阵编号后,程序要求用户输入
输入列号:
M = input('输入列号1或2或3或4或5或6')
然后,结果将是两列的矩阵:
第一列:输入数字的列元素
第二列:为该列分配的数字5或6或7,并确定是
重复通过列。
很抱歉这个长问题,我也想尽我所能总结和简化。
感谢您的帮助和感谢。
我可以问一个继续上一个问题吗?
如果有人想用文本表示数字,那可能吗?
这意味着,例如:
5:绿色
6:蓝色
7:红色
然后,继续进行上述分析。仅用这些单词替换数字
因此,第二列中的结果将是数字以外的单词。
很抱歉将我的问题放在答案框中,但我无法发表评论
这个问题
回答:
我希望您将所有矩阵都保留在一个变量中。这将使您不对不同的矩阵重复使用相同的命令或使用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)]; 希望我没有在某个地方犯错。
可能无需创建组合矩阵即可解决。但是您的矩阵很小,因此不应该有任何与内存或性能相关的问题。
更多&回答...