我需要构造一个N = 570 * 720 = 410400(图像像素数)的大NxN稀疏带矩阵A. 数学上,A(m,n)= C1 * exp( – | m-n | ^ 2); m = 1:N,n = 1:N 基本上它的高斯函数在每一行进行评估,其中行索引是平均值,有些是
数学上,A(m,n)= C1 * exp( – | m-n | ^ 2); m = 1:N,n = 1:N
基本上它的高斯函数在每一行进行评估,其中行索引是平均值,有些是任意但很小的标准偏差.
对于N = 100,它看起来像:
不幸的是,由于不必要的计算,它在N = 410400时运行非常慢.
1)使用for循环
A =稀疏(N,N);
对于i = 1:N
A(i,:) = normpdf(1:N,i,30);
结束
由于调用normpdf N次,这是浪费和缓慢的.
2)计算一次为1:2N的normpdf,其中均值为N,然后基于索引以适当的平均值循环移动A中的行. matlab中的circshift不能明确地移动矩阵列
具有不同的班次大小.再次需要召唤n次环球 – >浪费.
3)也许使用mvnpdf,但它需要输入向量并使用meshgrids生成这些
消耗大量内存.
4)使用具有用户定义的高斯函数(具有固定SD)的bsxfun接受两个参数,因为bsxfun不接受> 3个参数.
关于如何有效实现这一目标的任何想法?
谢谢
我可以建议另一种方法.什么会反对使用2 * N-by-1向量,可以通过对索引的简单转换进行索引?像这样:
% Oli's solution, and your request: NxN matrix N = 100; s = 30; pdf = @(x) 1/(sqrt(2*pi)*s)*exp(-0.5*(bsxfun(@minus,x(:),1:N)/s).^2); A = pdf(1:N); % My solution: 2*N x 1 vector B = exp(-0.5*((-N:N)/s).^2) / s/sqrt(2*pi);
诀窍是找到一个不错的通用索引规则.这是怎么做的:
% Indexing goes like this: fromB = @(ii,jj) B(N+1 + bsxfun(@minus, jj(:), ii)).'; ii = 30; jj = 23; from_A = A(ii,jj) from_B = fromB(ii,jj) ii = 1:2; jj = 4:6; from_A = A(ii, jj) from_B = fromB(ii,jj)
结果:
from_A = 0.012940955690785 from_B = 0.012940955690785 from_A = 0.013231751582567 0.013180394696194 0.013114657203398 0.013268557543798 0.013231751582567 0.013180394696194 from_B = 0.013231751582567 0.013180394696194 0.013114657203398 0.013268557543798 0.013231751582567 0.013180394696194
我相信你可以弄清楚如何做冒号索引和使用end关键字:)