4

我目前有一个数组 A,其维度为 N xtx t。我想创建一个二维矩阵 N xt,其形式为:

B = [ A[:,1,1] A[:,2,2],...,A[:,t,t]]

显然,我可以做到这一点的两种方法是完整地写出来(因为 t 很大,所以不切实际)和循环(可能很慢)。有没有办法在没有循环的情况下做到这一点。我想如果我这样做会起作用:

B = A[:,[1:end],[1:end]]

但这只是给了我原始矩阵。

4

3 回答 3

8

基本上,您需要开始考虑如何重组矩阵。

A = randn([5 3 3]);

让我们看看

A(:,:)

基本上你想要第 1、5、9 列。考虑一下,知道 t = 3,从当前列中你想增加 t + 1。公式基本上是:

((1:3)-1)*(3+1)+1 %(or (0:2)*(3+1) + 1)

插入 A 会产生您的解决方案

A(:,((1:3)-1)*(3+1)+1)

在一般格式中,您可以执行以下操作:

A(:,((1:t)-1)*(t+1)+1)

编辑:

Amro 基本上只是让我感到羞耻。这个想法仍然是一样的,它只是变得更具可读性,这要归功于end

因此使用:

A(:,1:t+1:end)
于 2013-06-26T13:44:06.287 回答
3

这是我对这个主题的看法:

mask = repmat(logical(permute(eye(size(A,2)), [3 1 2])), size(A,1), 1);
newA = reshape(A(mask), size(A,1), []);

只需生成蒙版,应用它并将结果重塑为正确的形状。

编辑:

或者更简单:

newA = A(:, logical(eye(size(A,2))))

或沿着相同的路线,

newA = A(:, diag(true(size(A,2),1)));

这有点快。

于 2013-06-26T14:12:26.660 回答
1

MATLAB 非常适合向量和矩阵,但是当涉及到“通用数组”时,您通常必须切换到“通用方法”。当您习惯于轻松操作矩阵/向量时,这看起来真的很笨拙、落后且根本不方便(实际上有非常可辩护的理由,但这是另一次讨论:)。

下面的版本通过每个页面循环arrayfun(仅比大型矩阵的正常循环更快)并diag在每个页面上调用:

% "flip" the array, so that 3rd dimension becomes the 1st (rows), and 
% the 1st dimension becomes the 3rd, so that each "page" is a regular 
% matrix. You want the diagonals of all these matrices.
b = permute(a, [3 2 1]);

% Now "loop" through the pages, and collect the matrix diagonal for each page
c = arrayfun(@(ii)diag(b(:,:,ii)), 1:size(b,3), 'UniformOutput', false);

% The above will output a cell-array, which you can cast back to 
% a numeric matrix through this operation: 
A = [c{:}];
于 2013-06-26T13:42:39.587 回答