我在维度A
的Matlab中有一个矩阵m x 3
,例如m=18
A=[ 2| 1 1;
3| 1 2;
-8| 1 3;
-------
-5| 1 1;
2| 1 2;
6| 1 3;
-------
7| 2 1;
3| 2 2;
1| 2 3;
5| 2 4;
-------
3| 2 1;
-8| 2 2;
1| 2 3;
0| 2 4;
-------
1| 2 1;
2| 2 2;
7| 2 3;
9| 2 4]
A
的特征如下:
它由t
子矩阵组成。在示例中t=5
。
每个子矩阵t
的维度b x 3
都带有b<=m
,而b
可以取{3,4,5,...,m}
中的任何值(显然,某种方式是这样的所有行的总和是m
)。在示例中,第一个和第二个子矩阵的维度为3 x 3
,最后三个子矩阵的维度为4 x 3
。
相同维度的所有子矩阵一个接一个地堆叠。在示例中,首先我们有子矩阵3 x 3
,然后是子矩阵4 x 3
。
然后我有一个维度B
的矩阵f x 3
,其中f=size(unique(A(:,2:end),'rows','stable'),1)
其中最后两列重现unique(A(:,2:end),'rows','stable')
中的元素,例如在上面的示例中f=7
和
B=[2| 1 1;
3| 1 2;
1| 1 3;
7| 2 1;
8| 2 2;
10| 2 3;
2| 2 4]
我想构建(可能没有循环)维度C
的矩阵f x t
,以便C(:,i)
由
1)获取i
的{{1}}个子矩阵,并将其称为A
。 H
的行数为H
。 <f
的列数为H
。例如。如果示例中为3
,
i=1
2)计算维H=[2| 1 1;
3| 1 2;
-8| 1 3]
的{{1}}。在示例中D=ismember(B(:,2:3),H(:,2:3),'rows')
时,f x 1
;
3)生成i=1
,即在示例中D=[1 1 1 0 0 0 0]'
。
4)替换E(f,1)=0
,即在示例中使用E=[0 0 0 0 0 0 0]'
,E(D)=H(:,i)
5)计算i=1
,即在E=[2 3 -8 0 0 0 0]
的示例中
C(:,i)=E-B(:,1)
在上面的示例中总结了所有i=1
C(:,1)=[2-2;
3-3;
-8-1;
0-7;
0-8;
0-10;
0-2]
我对如何使用循环构造i
有一个粗略的想法;我将不胜感激任何不需要循环的建议,并且可能很快,因为我使用的实际矩阵具有巨大的尺寸。一个想法(我不知道如何实现)可能是:创建维度C=[ 2-2 | -5-2 | 0-2 | 0-2 | 0-2 ;
3-3 | 2-3 | 0-3 | 0-3 | 0-3 ;
-8-1 | 6-1 | 0-1 | 0-1 | 0-1 ;
0-7 | 0-7 | 7-7 | 3-7 | 1-7 ;
0-8 | 0-8 | 3-8 |-8-8 | 2-8 ;
0-10 | 0-10 |1-10 |1-10 | 7-10;
0-2 | 0-2 | 5-2 | 0-2 | 9-2;]
的单元格变量,其中在每个单元格中我放置C
的子矩阵,然后应用步骤2),3),4),5)对每个细胞进行重新组装。
答案 0 :(得分:0)
好的,我希望我得到你想要的东西,因为你的例子和代码不容易理解。关于循环,你只需要一个循环,并且当编译一个循环时,它不应该是一个问题。
首先输入数据,我为了便于阅读而进行了转换,并添加了与您的行对应的索引列。
A = [1 1 1 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5
2 3 -8 -5 2 6 7 3 1 5 3 -8 1 0 1 2 7 9
1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
1 2 3 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4]';
B = [2 3 1 7 8 10 2
1 1 1 2 2 2 2
1 2 3 1 2 3 4]';
t = length(unique(A(:,1)));
C = zeros(f,t);
for ii=1:length(unique(A(:,1)))
C(ismember(B(:,2:3),A(A(:,1)==ii,3:4),'rows'),ii) = A(A(:,1)==ii,2);
C(:,ii) = C(:,ii)-B(:,1);
end
输出将是您想要的
C = [0 -7 -2 -2 -2
0 -1 -3 -3 -3
-9 5 -1 -1 -1
-7 -7 0 -4 -6
-8 -8 -5 -16 -6
-10 -10 -9 -9 -3
-2 -2 3 -2 7];
享受