设计一个简单的矩阵来对矩阵中的值进行分组

时间:2015-08-04 13:39:39

标签: matlab matrix indexing

这个问题是我之前问题的继承问题:

1) Extract submatrices, 2) vectorize and then 3) put back

现在,我有两名患者,名为AnnBen

enter image description here

实际上,矩阵ABAnn的数据,矩阵CBen的数据:

enter image description here

现在,我需要设计一个矩阵M,使y = M*x位于

y = [a11, a21, a12, a22, b11, b21, b12, b22]'这是一个向量,由左上角子矩阵AnnBen的连接产生;

x = [2, 5, 4, 6, 7, 9, 6, 2, 9, 3, 4, 2]'这是一个向量,由子矩阵ABC的连接产生。

此处,M8 by 12矩阵

a11 = 2 + 7a21 = 5 + 9,..,a22 = 6 + 2b11 = 9,... b22 = 2

我手动设计M

M=zeros(8,12)
M(1,1)=1; M(1,5)=1; % compute a11
M(2,2)=1; M(2,6)=1; % compute a21
M(3,3)=1; M(3,7)=1; % compute a12
M(4,4)=1; M(4,8)=1; % compute a22
M(5,9)=1; % for setting b11 = 9, C(1,1)
M(6,10)=1; % for setting b21 = 3, C(2,1)
M(7,11)=1; % for setting b12 = 4, C(1,2)
M(8,12)=1 % for setting b22 = 2, C(2,2)

显然,一般来说M(i,j)i表示向量y的8个线性索引位置,而j表示向量x的线性索引位置}。

但是,我在很大程度上简化了我想要自动构建此M的原始问题。

先谢谢你帮忙。

2 个答案:

答案 0 :(得分:1)

您可以索引事物并提取您想要的内容而无需乘法。以你的例子:

A = [2 4 8; 5 6 3; 10 3 6];
B = [7 6 3; 9 2 9; 10 2 3];
C = [9 4 7;3 2 5; 10 3 4];
idx = logical([1 1 0;1 1 0; 0 0 0]);
Ai = A(idx);
Bi = B(idx);
Ci = C(idx);
output = [Ai; Bi; Ci];
y = [Ai + Bi; Ci]; % desired y vector

这显示了每个步骤,但它们可以分为两行。定义索引然后应用它。

idx = logical([1 1 0;1 1 0;0 0 0]);
output = [A(idx); B(idx); C(idx)];
y = [Ai + Bi; Ci]; % desired y vector

此外,您可以对idx = [1 2 4 5]'使用线性索引。这将为每个A B C生成相同的子向量。无论哪种方式都有效。

idx = [1 2 4 5]';

或者

idx = [1;2;4;5];
output = [A(idx); B(idx); C(idx)];
y = [Ai + Bi; Ci]; % desired y vector

无论哪种方式都有效。查看doc sub2ind以获取MathWorks索引的一些示例。

答案 1 :(得分:1)

在这里,你有我的解决方案。我基本上按照你的建议自动构建了矩阵M(来自正确的索引)。

A = [2 4 8;
    5 6 3;
    10 3 6];

B = [7 6 3;
    9 2 9;
    10 2 3];
C = [9 4 7;
    3 2 5;
    10 3 4];

% All matrices in the same array
concat = cat(3, A, B, C);
concat_sub = concat(1:2,1:2,:);
x = concat_sub(:);

n = numel(x)/3; %Number of elements in each subset
M2 = zeros(12,8); %Transpose of the M matrix (it could be implemented directly over M but that was my first approach)

% The indexes you need
idx1 = 1:13:12*n; % Indeces for A
idx2 = 5:13:12*2*n;   % Indices for B and C


M2([idx1 idx2]) = 1;
M = M2';

y = M*x

我利用矩阵M shold所采用的形状: enter image description here