【问题标题】:Extract the diagonal of data and regroup the numbers提取数据的对角线并重新组合数字
【发布时间】:2013-03-26 03:49:42
【问题描述】:

我有如下数据:

for a=1:2
    for b=1:3
        m{a,b}=zeros(3,3)
    end
 end

m{1,1}=[6 1 1;1 7 1;1 1 6];
m{1,2}=[3 2 2;2 5 2;2 2 6];
m{1,3}=[5 3 3;3 9 3;3 3 7];

m{2,1}=[2 4 4;4 5 4;4 4 8];
m{2,2}=[2 1 1;1 6 1;1 1 5];
m{2,3}=[6 2 2;2 7 2;2 2 8];

我想只取每组数据的对角线并重新组合这些数字。例如,

%RESULT

row_1_1=[6;3;5]  %which 6 from m{1,1}(1,1), 3 from m{1,2}(1,1) and 5 from m{1,3}(1,1)

row_1_2=[7;5;9]  %which 7 from m{1,1}(2,2), 5 from m{1,2}(2,2) and 9 from m{1,3}(2,2)

row_1_3=[6;6;7]  %which 6 from m{1,1}(3,3), 6 from m{1,2}(3,3) and 7 from m{1,3}(3,3)

row_2_1=[2;2;6]  %which 2 from m{2,1}(1,1), 2 from m{2,2}(1,1) and 6 from m{2,3}(1,1)

等等。

知道如何获得这些结果吗?谢谢~

【问题讨论】:

  • 您是否注意到第 1,:,1 列等于 diag(m{1,1})。如果你重塑你的问题,也许你可以让它变得更容易。
  • 为什么要将它们存储为row_1_1 ... row_2_3 而不是rows{1,1} ... rows{2,3}

标签: matlab for-loop matrix


【解决方案1】:

你可以这样做:

row_result = zeros(a,b,3);
for i=1:a
    for j=1:b
        for k = 1:3
            row_result(i,k,j) = m{i,k}(j,j);
        end
    end
end

对于提供的示例数据,这将产生如下结果:

>> row_result(1,:,1)

ans =

     6     3     5

>> row_result(1,:,2)

ans =

     7     5     9

>> row_result(1,:,3)

ans =

     6     6     7

>> row_result(2,:,1)

ans =

     2     2     6

【讨论】:

  • 可以像row_1_3=[6;6;7]这样保存结果吗??
  • 当然可以:简单的方法是去掉两个外部循环并对每个这样的变量进行硬编码;另一种方法(尽管我自己没有尝试过)是创建给定here 的动态变量名称。然而,使用动态变量名并不被认为是好的编程习惯。
【解决方案2】:

我认为您在构建新矩阵时遇到了丑陋的 for 循环。

您是否出于某种原因使用元胞数组,而不是其他数据类型,例如更高维矩阵或结构数组?元胞数组的意义在于每个元胞的内容是完全相互独立的,也就是说不能使用':'来访问元胞内容的内部字段。

【讨论】:

  • 在这种情况下,只需使用更高维的矩阵:m=zeros(2,3,3,3); m(1,1,:,:)=[6 1 1;1 7 1;1 1 6];等等……
  • 然后,你会得到 row_1_1=m(1,:,1,1)
猜你喜欢
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2017-02-09
  • 2017-06-17
相关资源
最近更新 更多