gpt4 book ai didi

matlab - 如何从保留其在 Matlab 中的大小的矩阵中删除 Inf 值

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:44 25 4
gpt4 key购买 nike

我有一个循环中的矩阵,它是

m=


-132.5901 -137.2695 -114.1264 -131.4986 -134.5733 Inf
Inf Inf Inf -135.2631 -121.7322 -119.7471
-132.7978 -123.8068 -135.9385 Inf -134.1602 -117.6997
-130.1930 -134.0093 -137.4125 -128.7641 Inf -116.0473

我想要一个可以在循环中使用的命令来得到答案:

 -132.5901 -137.2695 -114.1264 -131.4986 -134.5733  -119.7471  
-132.7978 -123.8068 -135.9385 -135.2631 -121.7322 -117.6997
-130.1930 -134.0093 -137.4125 -128.7641 -134.1602 -116.0473

我不想要使用 isfinite 命令的单个向量。应使用 Matlab 自动保留矩阵大小。

最佳答案

我假设在保留原始矩阵的大小时,您希望我们用 NaN 填充解矩阵的底部。我还假设在任何给定的列中可能有多个 Inf。在这种情况下,以下基于循环的解决方案对我有用:

%# Set up an example matrix
M = [Inf 2 Inf 4; 5 Inf 6 7; Inf Inf 8 Inf];
[T, N] = size(M);

%# Get an index of finite elements
I1 = isfinite(M);

%# Solution 1
Soln1 = NaN(T, N);
for n = 1:N
CurCol = M(:, n);
Soln1(1:sum(I1(:, n)), n) = CurCol(I1(:, n));
end

对于一般情况,这个问题可能有一个完全矢量化的解决方案(肯定有 - 请参阅下面的更新)。但是,如果它比基于循环的解决方案产生很大的加速,我会感到惊讶。如果您设置问题,那么在 Matlab 中单循环现在非常快,因此您可以对矩阵的列(而不是行)进行操作,因为这些元素在内存中按顺序分配。

现在,让我们假设每列只有一个 Inf。在这种情况下,问题更容易解决,并且可以使用以下一行代码完成:

%# Solution 2
Soln2 = [reshape(M(isfinite(M)), T-1, N); NaN(1, N)];

对于我设置的示例矩阵,解决方案 2 显然会失败,因为 6 个元素不能重新排列成 T-1×N(即 2×4)矩阵。

更新: 好吧,没有充分的理由,我很烦我不能没有循环。因此,这是一个无循环的解决方案:

%# Solution 3
Soln3 = NaN(T, N);
I2 = bsxfun(@plus, cumsum(isfinite(M)), (0:T:T*(N-1)));
I2 = I2(:);
I2(I1 == 0) = [];
Soln3(I2) = M(isfinite(M));

循环与非循环解决方案的快速(非常)非严格速度测试:

Elapsed time is 0.203997 seconds.
Elapsed time is 0.251969 seconds.

非循环解决方案可能会改进(相对而言),但如果 M 更大。

现在我需要回去工作:-)

关于matlab - 如何从保留其在 Matlab 中的大小的矩阵中删除 Inf 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13559510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com