2012-01-18 66 views
2

我需要能够返回维度为LxLxL..xL的矩阵的元素的索引[x1 x2 ... xd]。维数d是提供给我的函数的变量。该矩阵不存在,而是我有一个长度为L^d的线性数组。对于数组中的给定索引i,我想知道矩阵中的等效索引。我已经可以使用简单的for循环来做到这一点,但我很想知道我是否可以以某种方式使用ind2sub。我的问题是,如果我做返回可变维矩阵的下标

x=zeros(1,d) 
x=ind2sub(L,i) 

x被重新分配一个单一的数字,而不是所有下标的数组。有没有办法做到这一点?

回答

6

我假设“指数[x1 x2 ... xd]”是指沿等效d维阵列的每个维度的下标。

您需要将L和d转换为维数组,然后从ind2sub捕获多个argout。这是一个这样做的功能。你可以称它为x = myind2sub(L, d, i)

function out = myind2sub(L, d, ix) 

sz = repmat(L, [1 d]); %// dimension array for a d-dimension array L long on each side 
c = cell([1 d]); %// dynamically sized varargout 
[c{:}] = ind2sub(sz, ix); 
out = [c{:}]; 

但你也应该问为什么你的线性阵列中存储并计算标,而不是仅仅将其存储在首位多维数组。在Matlab中,多维数组存储在连续的内存块中,所以它很高效,可以使用多维下标或线性索引来索引它。如果您有线性阵列,只需拨打reshape(myarray, sz)将其转换为多维等值。

+0

谢谢!这是涉及多维度变化的模拟的一部分。 – Ivan 2012-01-18 22:53:03

+0

然后你可以使用'reshape()';它很便宜,因为它只是在mxarray头文件中包含维度元数据;底层数据将保留在内存中。实际上,Matlab的数组支持已经做到了这一点,并在用户代码中重新实现它可能会让你的代码变慢。 – 2012-01-18 22:58:16

+0

这么聪明。谢谢谢谢。 – Frederick 2013-11-06 17:14:20