连接具有不同起始索引和不同结束索引的矩阵(对齐)

时间:2015-07-26 05:25:34

标签: matlab matrix concatenation

for i = 1 : numel(T);
    j = 1 : numel(T(i).n);
P(i,j) = (T(i).n);
G(i) = (T(i).lastPulse)-1100;
Y = P(1,G(1):length(T(1).n));
S = P(2,G(2):length(T(2).n));
end

我有前面的代码。 P是(191x10000)矩阵。我想要在S和Y中显示每行的特定部分,然后连接S和Y以及与P的其他行对应的其他行矩阵以创建矩阵A(191x [最大长度为(S,Y,...)。 ..)])。但棘手的部分是我无法使S和Y对齐。

示例:

P = [1 2 1 3 1 1 1 0 3 1 0]
    [3 0 2 0 1 1 4 1 1 2 0];
S = P(1,1:7) = [1 2 1 3 1 1 1];
Y = P(2,5:10) = [1 1 4 1 1 2];
% A = concatenated S and Y aligned to original P. 
A = [ 1   2   1   3   1   1   1  nan nan nan nan]
    [nan nan nan nan  1   1   4   1   1   2  nan];

我最好使用循环代替分离的矩阵,例如S和Y,因为我有很多行。

建议的答案:

我认为可能我必须使用与P对应的索引并使用它们来连接Y和S,我只是不知道如何执行这个想法,特别是在循环中。

1 个答案:

答案 0 :(得分:1)

如果我在脑海中正确地得到了问题,似乎bsxfun可以在这里用来创建一个掩码,然后保持掩码元素免于P因此对齐的输出。这是一个沿着这些方向实现的实现 -

%// Random input array
P = randi(9,5,11)

%// Define the start and stop(end) indices as vectors
start_idx = [1 5 3 4 11]
stop_idx = [7 10 3 6 11]

%// Get the size of P and initialize output array
[M,N] = size(P); 
P_out = NaN(M,N); 

%// Create the mask for extracting specific elements from P
mask = bsxfun(@le,start_idx(:),1:N) & bsxfun(@ge,stop_idx(:),1:N);

%// Put masked elements from P into output array
P_out(mask) = P(mask)

在不初始化输出的情况下获得输出的另一种方法就是这样 -

P_out = P.*mask;
P_out(~mask) = NaN;

因此,要与问题中使用的变量相关联,start_idx将为Gstop_idx将为[length(T(1).n),length(T(2).n).length(T(3).n),...]

示例运行 -

P =
     1     6     8     8     8     1     9     1     2     4     2
     8     8     6     3     7     6     7     2     5     1     2
     6     8     9     5     6     6     6     8     6     5     2
     9     9     5     9     3     7     9     5     1     2     1
     7     1     5     6     6     9     6     8     6     2     6
start_idx =
     1     5     3     4    11
stop_idx =
     7    10     3     6    11
P_out =
     1     6     8     8     8     1     9   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN     7     6     7     2     5     1   NaN
   NaN   NaN     9   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN     9     3     7   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN     6