我是Matlab的新手。我有一些问题。
我如何矢量化这个循环:
epsilon = 0.45;
t = -3.033;
n = 100;
I = ones(n,n);
%// diagonal block 1
DB1 = gallery('tridiag',ones(1,n-1),ones(1,n),ones(1,n-1));
for k = 1:n
DB1(k,k) = epsilon;
end
for k = 1:n-1
DB1(k,k+1) = t*heaviside((-1)^(k+1));
end
for k = 2:n
DB1(k,k-1) = t*heaviside((-1)^k);
这个包含LRG
,R2
,R1
的循环是3D数组
for k = 2:N
LRG(:,:,k) = inv(R(:,:,k) - R2(:,:,k-1)*LRG(:,:,k-1)*R1(:,:,k-1));
end
有没有办法处理数组(页面)的第三维而不多次写(:,:,...)
?
答案 0 :(得分:0)
您不需要调用gallery:这只会将DB1初始化为特定的稀疏三对角矩阵,然后您可以手动覆盖它。对于n=100
,我怀疑你实际上并不想处理稀疏矩阵。这是解决方案:
epsilon = 0.45; t = -3.033;
n = 100;
DB1 = zeros(n); %initialize to 0
%diagonal indices
inds=sub2ind([n n],1:n,1:n);
DB1(inds) = epsilon;
%superdiagonal
inds=sub2ind([n n],1:n-1,2:n);
DB1(inds) = t*heaviside((-1).^(2:n));
%subdiagonal
inds=sub2ind([n n],2:n,1:n-1);
DB1(inds) = t*heaviside((-1).^(2:n));
此处sub2ind
可让您从矩阵索引计算线性索引,从而可以访问矩阵中的“子向量”。请注意heaviside
中的指数化:您需要.^
而非^
才能使用向量2:n
执行按元素操作。
如果您坚持获取稀疏矩阵,可以通过调用
将此矩阵转换为稀疏矩阵DB1=sparse(DB1);
如果你的矩阵很小,这是最简单的选择。如果n
更大并且您确实需要稀疏矩阵,那么您可以通过
DB1new=sparse([1:n 1:n-1 2:n],[1:n 2:n 1:n-1],...
[epsilon*ones(1,n) t*heaviside((-1).^(2:n)) t*heaviside((-1).^(2:n))],n,n);
此调用根据其向量参数逐个设置DB1new
的元素:它从第一个输入参数获取第一个索引,从第二个输入参数获取seconf索引,从第三个输入参数获取相应的元素向量(参见MATLAB中的help sparse
)。
至于你的第二个问题:我不确定我是否理解正确。与我的示例一样,sub2ind
可用于将多维索引转换为线性索引,请参阅help sub2ind
。但就个人而言,我认为使用数组符号更加透明,不易出现错别字。而且我认为你无法对该循环进行矢量化:你必须明确计算每个k
的逆矩阵。