在Octave / Matlab中给出一些多维矩阵A,
获得与A相同大小的矩阵的最简单方法是什么,其中所有元素都被它们沿着第k维度的索引替换
即矩阵
A =
ans(:,:,1) =
0.095287 0.191905
0.226278 0.749100
ans(:,:,2) =
0.076826 0.131639
0.862747 0.699016
我想要一个函数f f(A,1)=
ans(:,:,1) =
1 1
2 2
ans(:,:,2) =
1 1
2 2
f(A,2)=
ans(:,:,1) =
1 2
1 2
ans(:,:,2) =
1 2
1 2
和
f(A,3)=
ans(:,:,1) =
1 1
1 1
ans(:,:,2) =
2 2
2 2
另外,给定稀疏矩阵B
获得另一个相同大小的稀疏矩阵的最简单方法是什么,其中非零元素被第k维度的索引替换? (与上述问题相同,但仅限于非零元素)
理想情况下,我正在寻找一种对八度音程进行良好矢量化的方法(意味着它没有明确地循环任何东西)
澄清:对于稀疏矩阵,我正在寻找一种不涉及在任何点创建全尺寸(B)矩阵的解决方案
答案 0 :(得分:2)
ndgrid()
做你想要的,虽然不是你想要的格式。如果事先知道输入A的暗淡,可以使用以下行创建N维网格:
% for matrix a where ndims(a) == 3
[x, y, z] = ndgrid (1:size(a,1), 1:size(a,2), 1:size(a,3));
% x is like f(a, 1)
% y is like f(a, 2)
% z is like f(a, 3)
您可以围绕ndgrid()编写自定义包装器,将其转换为您要查找的函数格式。
答案 1 :(得分:0)
如果有人好奇,因为我不知道ndgrid,这就是我想出的答案:
function [y] = indices(a,k)
s = size(a);
n = s(k);
D = length(s);
x = permute(a,[k,1:(k-1),(k+1):D]);
y = reshape(x,n,[]);
y = diag(1:n) * ones(size(y));
y = reshape(y,size(x));
y = permute(y,[(2:k),1,(k+1):D]);
endfunction
function [y] = spindices(a,k)
s = size(a);
n = s(k);
D = length(s);
x = permute(a,[k,1:(k-1),(k+1):D]);
y = reshape(x,n,[]);
y = spdiag(1:n) * spones(y);
y = reshape(y,size(x));
y = permute(y,[(2:k),1,(k+1):D]);
endfunction