我的问题很难或太简单。所以我一直在使用稀疏来创建来自不同向量的矩阵(例如here)
我使用sparse(i,j,s,m,n)
其中i
和j
是我用地板等派生的粒子的分配。
(它是细胞模拟中的粒子)。
这是1D
。我想矢量化这个问题的2D,并得到了我无法在八度音程中创建3D稀疏矩阵的问题。
我真的不喜欢八度音,我正在寻找一种解决方案,我可以根据i和j值将s中的值很好地放入矩阵中。
例如:我在单元格x=2
和y=2
中得到了粒子1,而不是我希望在(1,2,2,value)
中有一个来自粒子1的值的矩阵。有没有多少if's
和for's
?
答案 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空间中执行任何操作)。