![]() |
矩阵提取和分配数字或符号
我在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:红色 然后,继续进行上述分析。仅用这些单词替换数字 因此,第二列中的结果将是数字以外的单词。 很抱歉将我的问题放在答案框中,但我无法发表评论 这个问题 [B]回答:[/B] 我希望您将所有矩阵都保留在一个变量中。这将使您不对不同的矩阵重复使用相同的命令或使用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)]; 希望我没有在某个地方犯错。 可能无需创建组合矩阵即可解决。但是您的矩阵很小,因此不应该有任何与内存或性能相关的问题。 [url=https://stackoverflow.com/questions/4065743]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:14。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.