【问题标题】:Design a simple matrix to group values from matrices设计一个简单的矩阵来对矩阵中的值进行分组
【发布时间】:2015-08-04 13:39:38
【问题描述】:

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

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

现在,我有两个病人,分别是 AnnBen

确实,矩阵ABAnn 的数据,而矩阵CBen 的数据:

现在,我需要设计一个矩阵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 串联而成。

这里,M 是一个8 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 的原始问题。

提前感谢您帮助我。

【问题讨论】:

  • 不应该是x = [2, 5, 4, 6, 7, 9, 6, 2, 9, 3, 4, 2]'(加“3”)吗?
  • @dev 是的,我错过了3,我对其进行了编辑。

标签: matlab matrix indexing


【解决方案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 的形状:

【讨论】:

    【解决方案2】:

    您可以对事物进行索引并提取您想要的内容,而无需乘法。以您为例:

    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 中的一些索引示例。

    【讨论】:

    • 谢谢,你教我如何构造x。但是,我需要的是一个矩阵 M,这样通过将 Mx 相乘,我可以自动获得一个 y
    • M 只是将ABC 中的两个值加在一起......只需添加子向量即可。再次不需要乘法。上面的 4 个值是Ai + Bi。低4位直接是Ci
    • 感谢您给我cmets。我明白你的话。但是,我的问题被简化了,因此简单的添加和分配就可以完成工作。对于我的实际应用程序,我需要自动构造M,因为我必须处理许多患者并且所涉及的矩阵不再是二维的。
    • @nam 你查看我的解决方案了吗?我确实构建了矩阵M
    • @josoler 是的,谢谢。我一直在尝试您的解决方案并适应我的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多