Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays matlab:在多维数组中寻址多行_Arrays_Matlab_Matrix_Multidimensional Array_Matrix Indexing - Fatal编程技术网

Arrays matlab:在多维数组中寻址多行

Arrays matlab:在多维数组中寻址多行,arrays,matlab,matrix,multidimensional-array,matrix-indexing,Arrays,Matlab,Matrix,Multidimensional Array,Matrix Indexing,假设“r”是大小为[N,N,M]的多维数组,“tab”是大小为[N]且值为1..N的表(例如,取“tab=randperm(N)”。我正在寻找有效的方法来完成以下工作: c = ones(M, 1); for k=1:N c = c .* squeeze(r(tab(k),k,:)); end 我想用矩阵表示法,使用prod,但没有找到解决方案,因为“r(tab(1:N),1:N,:)”返回一个nxm矩阵,而不是N行 有什么建议吗?跨维度1、2使用;沿维

假设“r”是大小为[N,N,M]的多维数组,“tab”是大小为[N]且值为1..N的表(例如,取“tab=randperm(N)”。我正在寻找有效的方法来完成以下工作:

    c = ones(M, 1);
    for k=1:N
        c = c .* squeeze(r(tab(k),k,:));
    end
我想用矩阵表示法,使用prod,但没有找到解决方案,因为“r(tab(1:N),1:N,:)”返回一个nxm矩阵,而不是N行

有什么建议吗?

跨维度1、2使用;沿维度3复制;然后:

%% example data
M=3;
N=4;
r=rand(N,N,M);
tab=randperm(N);

%% original code    

c = ones(M, 1);
for k=1:N
    c = c .* squeeze(r(tab(k),k,:));
end

%% Code is equivalent to:

% rh=r(tab,:,:);
% c2 = ones(M, 1);
% for k=1:N
%     c2 = c2 .* squeeze(rh(k,k,:));
% end
% assert(all(c2==c));

%% second solution: Use sub2ind to index
rh=r(tab,:,:);

ix=sub2ind(size(rh),ceil(1/M:1/M:N),ceil(1/M:1/M:N),repmat(1:M,1,N));
rh2=rh(ix);
rh3=reshape(rh2,M,N);
c3=prod(rh3,2);
assert(all(c3==c));

@DanielR:来自问题文本:“and tab是一个大小为[N]的表,其值为1..N”@RobertP。是正确的;e、 g.以“tab=randperm(N)”为例@UriCohen:第一次阅读,我希望得到一些最近引入matlab的类
表的数据。我不太理解语法:“.”是有效语法吗?如果你不介意获得行向量而不是行向量,你可以删除最后的
c = prod(r(bsxfun(@plus, sub2ind([N N], tab, 1:N).', (0:M-1)*N^2))).';