【发布时间】:2012-12-15 17:50:54
【问题描述】:
我试图在 MATLAB 中索引一个大型矩阵,该矩阵包含跨行和跨列单调递增的数字,即,如果矩阵被称为A,则对于每个(i,j)、A(i+1,j) > A(i,j) 和A(i,j+1) > A(i,j)。
我需要创建一个随机数 n 并将其与矩阵 A 的值进行比较,以查看该随机数应放置在矩阵 A 中的哪个位置。换句话说,n 的值可能不等于任何矩阵的内容,但它可能位于任意两行和任意两列之间,并确定了一个“bin”,该“bin”标识了它在 A 中的位置。一旦找到这个位置,我就会在新矩阵中增加相应的索引和 A 一样大。
问题是我想这样做 1,000,000 次。我需要创建一个随机数一百万次,并对这些数字中的每一个进行索引检查。这是从一个点降落在屏幕上的一百万个光子的蒙特卡罗模拟;矩阵A由球坐标中的角度组成,随机数为每个入射光子的立体角。
到目前为止,我的代码是这样的(我没有在这里复制粘贴,因为细节并不重要):
for k = 1:1000000
n = rand(1,1)*pi;
for i = length(A(:,1))
for j = length(A(1,:))
if (n > A(i-1,j)) && (n < A(i+1,j)) && (n > A(i,j-1)) && (n < A(i,j+1))
new_img(i,j) = new_img(i,j) + 1; % new_img defined previously as zeros
end
end
end
end
“if”语句只是检查 A 中构成 n 边界的索引。
这工作得很好,但它需要很长的时间,特别是因为我的矩阵 A 是尺寸为 11856 x 11000 的图像。有没有更快/更聪明/更简单的方法?
提前致谢。
【问题讨论】:
-
代码原样将出错,索引越界到
A。 -
你是对的 - 谢谢。我的实际代码考虑到了这一点;我只是想了解它的要点。
-
另外,你不应该用“点击”的数量来衡量增量吗?否则,角度越大,光子就越多。
-
如果您发布
surf渲染A可能是个好主意。 -
每个“命中”对应于落在该“bin”中的光子,因此靠近中心的“bin”将有更多“命中”,从而导致中心的传播最强烈。