如何在八度音阶中创建一个三维类稀疏矩阵



我的问题很难或太简单。所以我一直在使用稀疏从不同的向量创建一个矩阵(这里的例子)

我使用sparse(i,j,s,m,n),其中ij是由地板等导出的粒子I的分配。(它是细胞内粒子模拟)。

这是针对CCD_ 4的。我想将这个问题向量化为2D,并得到了无法在八度音阶中创建3D稀疏矩阵的问题。

我真的不是八度音阶的专家,我正在寻找一个解决方案,我可以根据I和j的值将s的值很好地放入矩阵中。

例如:我在单元x=2y=2中得到了粒子一,而我希望在(1,2,2,value)中得到一个具有粒子一值的矩阵。有没有一种方法不需要太多的if'sfor's

目前不可能在八进制中有N维稀疏矩阵。您可以在以下示例中看到这一点,该示例试图将3x9稀疏矩阵重塑为3x3x3:

octave> sp = sparse (2, 6, 1, 3, 9)
sp =
Compressed Column Sparse (rows = 3, cols = 9, nnz = 1 [3.7%])
  (2, 6) ->  1
octave> reshape (sp, [3 3 3])
warning: reshape: sparse reshape to N-d array smashes dims
ans =
Compressed Column Sparse (rows = 3, cols = 9, nnz = 1 [3.7%])
  (2, 6) ->  1

你可以做的是有一个稀疏矩阵的单元阵列。因此,对于KxMxN的粒子,可以使用data{k} = sparse (M, N, value)并使用data{k}(m,n)访问它。这并不理想,但取决于你如何组织数据,你可能会让事情变得或多或少可读。

稀疏NDArray在Octave和Matlab中都不可能。然而,有一个用于Matlab的类实现了稀疏NDArray,尽管性能可能不是最优的,但它仍然可能比使用单元阵列要好得多,因为它在内部将稀疏NDArray表示为简单的2D稀疏矩阵:

http://www.mathworks.com/matlabcentral/fileexchange/29832-n-dimensional-sparse-arrays

从v4开始,Octave现在支持classdef。我还没有尝试过,但即使它还不起作用,也可能很快就会起作用。无论如何,您可以在脚本中看到它是如何完成的,并通过应用相同的想法(使用2D稀疏矩阵,您可以使用自定义函数来操作该矩阵,以便在ND空间中执行您想要的任何操作)来制作一个非类、全函数的版本。

最新更新