如何在八度音程中创建一个像3d稀疏的矩阵

时间:2013-12-04 21:17:43

标签: matlab matrix octave particles

我的问题很难或太简单。所以我一直在使用稀疏来创建来自不同向量的矩阵(例如here

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

这是1D。我想矢量化这个问题的2D,并得到了我无法在八度音程中创建3D稀疏矩阵的问题。

我真的不喜欢八度音,我正在寻找一种解决方案,我可以根据i和j值将s中的值很好地放入矩阵中。

例如:我在单元格x=2y=2中得到了粒子1,而不是我希望在(1,2,2,value)中有一个来自粒子1的值的矩阵。有没有多少if'sfor's

2 个答案:

答案 0 :(得分:1)

目前在Octave中不可能有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)访问它。这并不理想,但根据您如何组织数据,您可能会使事情变得更具可读性。

答案 1 :(得分:0)

在Octave和Matlab中都不能使用稀疏NDArray。然而,Matlab有一个实现稀疏NDArray的类,虽然性能可能不是最优的,它仍然可能比使用单元数组好很多,因为它在内部将稀疏NDArray表示为一个简单的2D稀疏矩阵: / p>

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

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