我的问题很难或太简单。所以我一直在使用稀疏从不同的向量创建一个矩阵(这里的例子)
我使用sparse(i,j,s,m,n)
,其中i
和j
是由地板等导出的粒子I的分配。(它是细胞内粒子模拟)。
这是针对CCD_ 4的。我想将这个问题向量化为2D,并得到了无法在八度音阶中创建3D稀疏矩阵的问题。
我真的不是八度音阶的专家,我正在寻找一个解决方案,我可以根据I和j的值将s的值很好地放入矩阵中。
例如:我在单元x=2
和y=2
中得到了粒子一,而我希望在(1,2,2,value)
中得到一个具有粒子一值的矩阵。有没有一种方法不需要太多的if's
和for'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空间中执行您想要的任何操作)来制作一个非类、全函数的版本。