我在Matlab中有一个维数A的矩阵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<=m的维数b x 3,b可以在{3,4,5,...,m}中取任意值(显然,所有行的和都是m)。在该示例中,第一个和第二个子矩阵具有维数3 x 3,最后三个子矩阵具有维数4 x 3。3 x 3,然后是子矩阵4 x 3。然后,我有一个维数B的矩阵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的矩阵(可能不带循环),这样C(:,i)就可以由
1)取i-th子矩阵A,称其为H。H的行数是<f。H的列数为3。例如,如果示例中的i=1,
H=[2| 1 1;
3| 1 2;
-8| 1 3]2)计算维数D=ismember(B(:,2:3),H(:,2:3),'rows') f x 1。当i=1在示例中,D=[1 1 1 0 0 0 0]';
3)生成E(f,1)=0,即在E=[0 0 0 0 0 0 0]'示例中。
4)将E(D)=H(:,i)替换为i=1,E=[2 3 -8 0 0 0 0],即在示例中
5)计算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,我有一个粗略的想法;如果不需要循环,并且考虑到我正在处理的实际矩阵具有巨大的维度,那么它可能很快就会给我带来很大的好处。一个想法(我不知道如何实现)可以是:创建维度tx1的单元变量,在每个单元格中,我将A的子矩阵放入其中,然后将步骤2、3)、4)、5)应用于每个单元格并重新组装。
发布于 2015-10-22 01:09:39
好的,我希望我得到了您想要的,因为您的示例和代码并不容易理解。关于循环,您只需要一个循环,而当编译一个级别循环时,就不会有问题了。
首先,为了便于阅读,我转换了输入数据,并添加了一个与行相对应的索引列。
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];尽情享受
https://stackoverflow.com/questions/31077384
复制相似问题