当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – Matlab:构建非常大的稀疏带矩阵,内存和计算量都很小

来源:互联网 收集:自由互联 发布时间:2021-06-22
我需要构造一个N = 570 * 720 = 410400(图像像素数)的大NxN稀疏带矩阵A. 数学上,A(m,n)= C1 * exp( – | m-n | ^ 2); m = 1:N,n = 1:N 基本上它的高斯函数在每一行进行评估,其中行索引是平均值,有些是
我需要构造一个N = 570 * 720 = 410400(图像像素数)的大NxN稀疏带矩阵A.

数学上,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关键字:)

网友评论