【问题标题】:How to sum values among matrices of structures under certain conditions in Matlab?如何在Matlab中的某些条件下对结构矩阵之间的值求和?
【发布时间】:2013-05-19 23:10:46
【问题描述】:

我是 matlab 新手,不熟悉矩阵数组。我有许多矩阵 nx6:

<26x6 double>
<21x6 double>
<27x6 double>
<36x6 double>
<29x6 double>
<30x6 double>
 ....

每个矩阵都是这种类型:

>> Matrix{1,1}

A   B   C   D    E                  F
1   2   6   223  735064.287500000   F11
2   3   6   223  735064.288194445   F12
3   4   6   223  735064.288888889   F13
4   5   6   223  735064.290277778   F14

>> Matrix{2,1}

A   B   C   D    E                  F
1   2   6   223  735064.700694445   F21
2   3   6   223  735064.701388889   F22
3   4   6   223  735064.702083333   F23
4   5   6   223  735064.702777778   F24

>> Matrix{3,1}

A   B   C   D    E                  F
1   2   7   86  735064.3541666666   F31
2   3   7   86  735064.3548611112   F32
3   4   7   86  735064.3555555555   F33
4   5   7   86  735064.3562499999   F34
5   6   7   86  735064.702777778    F35

>> Matrix{4,1}

A   B   C   D    E                  F
1   2   7   86   735064.3569444444  F41
2   3   7   86   735064.3576388888  F42
3   4   7   86   735064.3583333333  F43
4   5   7   86   735064.3590277778  F44
5   6   6   86   735064.702777778   F45

其中 E 和 F 是 datenum 格式的日期。具体F是时间差。

同时考虑所有矩阵,我想在 A、B、D 列中具有相等值的所有矩阵中对 F 列的值求和。

对于 D 列的每个值(总线数),我想获得一个新矩阵,如下所示:

A   B   C   D    H
1   2   6   223  F11+F21
2   3   6   223  F12+F22
3   4   6   223  F13+F23
4   5   6   223  F14+F24


A   B   C   D   H
1   2   7   86  F31+F41
2   3   7   86  F32+F42
3   4   7   86  F33+F43
4   5   7   86  F34+F44
5   6   7   86  F35+F45

提前感谢您的帮助!

【问题讨论】:

  • How group sums by multiple columns? 的可能副本。还有how to group rpws with same column values 和其他几个...搜索“[matlab] grouping”
  • @Shai:第二个链接是两个大小相等的矩阵的示例,因此情况不同。能否请您告诉我是否有与我的情况类似的其他示例?提前谢谢你
  • 更新:这有效 [~,ind]=unique(matrix{i,1},'rows') 但它只为 A 列创建索引

标签: matlab matrix structure


【解决方案1】:

这种方法应该可以帮助您入门。我建议设置一个矩阵来存储第 1,2 列和第 4 列之间的比较。基于该矩阵,您可以生成输出矩阵。这样可以节省您嵌套的 if 语句并检查您的循环。
这是一个例子(请注意我更改了Matrix{1,1}的第3行):

Matrix{1,1} = [ ...

1   2   6   223  735064.287500000   1;
2   3   6   223  735064.288194445   2;
3   4   6   223  735064.288888889   3;
4   5   6   223  735064.290277778   4];

Matrix{2,1} = [ ...

1   2   6   223  735064.700694445   10;
2   3   6   223  735064.701388889   10;
2   4   6   223  735064.702083333   10;
4   5   6   223  735064.702777778   10];

COMP = Matrix{1,1}(:,[1:2 4])==Matrix{2,1}(:,[1:2 4]);

a = 1;

for i=1:size(Matrix{1,1},1)
    if sum(COMP(i,:)) == 3
        SUM{1,1}(a,1:5) = Matrix{1,1}(i,1:5);
        SUM{1,1}(a,6) = Matrix{1,1}(i,6) + Matrix{2,1}(i,6);
        a = a + 1;
    end
end

矩阵COMP 存储1 用于比较第1、2 和4 列时Matrix{1,1}Matrix{2,1} 中相同的每个元素。
这将if-语句简化为检查一行中的所有元素是否一致(因此sum == 3)。如果满足该条件,则会生成一个新矩阵 (SUM{1,1}),它将第 6 列中的条目相加,在这种情况下:

 SUM{1,1}(:,6) = 

     11
     12
     14

【讨论】:

  • 非常感谢,该示例正在运行,我正在努力使其适应我的情况。我认为 COMP 应该是 1 或 0 的矩阵数组。
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 2023-03-16
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多