如何为数组

时间:2015-07-29 11:30:58

标签: matlab

我是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);

这个包含LRGR2R1的循环是3D数组

for k = 2:N
    LRG(:,:,k) = inv(R(:,:,k) - R2(:,:,k-1)*LRG(:,:,k-1)*R1(:,:,k-1));
end

有没有办法处理数组(页面)的第三维而不多次写(:,:,...)

1 个答案:

答案 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的逆矩阵。