-1

我有大三角矩阵。

在此处输入图像描述

其中有不同颜色标记的相关数据。我想有条件地删除由黄绿色轮廓标记的点:

  • 贪婪地去除非线性物体的区域
  • 在概率为 50% 的线性对象区域上懒惰地移除

我的尝试

我根据 Shai 的评论运行

% remove linear things on nonlinear area lazily: matrix(97:103, 1:98)
% remove linear things greedily elsewhere
for row=0:97
    for column=0:111
        % Lazy removal
        if and(row > 97, row < 104)
            if and(column > 0, column < 98)
                if randn > 0
                    matrix( matrix < 9 ) = 0;
                end
            end
        end

        % Greedy removal
        if or(column < 97, column > 104)
            % Remove all points in these regions because no linear objects here
            matrix(:, 1:97) = 0;
            matrix(:, 104:111) = 0;
        end
    end
end

我明白了

在此处输入图像描述

这比无条件删除要好得多

在此处输入图像描述

但仍然可以改进延迟删除的条件部分。我认为您不能在这里使用 Shai 的较短版本,并且必须使用嵌套循环,因为您有条件删除。

您不能使用等高线,contour(matrix, clines)因为非线性对象也覆盖了线性对象。所以你需要通过选择图形的特定区域进行有条件的移除,进行贪婪移除和懒惰移除。Daniel R 的命令 ,contour(...,'ShowText','on')在这里似乎对我们没有帮助,我们不能简单地按值删除。我认为下图显示了零点,可能是奇异点,因为图中应该有 111 个奇异点。 下图是否显示数据的奇点或仅为零值?

在此处输入图像描述

如何将特定的移除规则应用于线性对象的区域?

如何有条件地删除 Matlab 三角矩阵中以黄绿色标记的点?

4

2 回答 2

2

您的数据很复杂,知道这一点,并且知道该contour函数对复数做了什么 - 只需绘制实部 - 很容易过滤您的数据。

只需将矩阵的每个元素设置为NaN,您可以通过使用原始图绘制颜色条并猜测值来找出阈值。或者看看你的数据矩阵的实部等。

根据需要调整阈值

请注意,颜色条应该相等以进行比较

load('tri4_good.mat');
%original plot
figure(1)
[~,h] = contour(samii);
colorbar
caxis([-2,1.5].*10^7)

%get data
X = get(h,'Xdata');
Y = get(h,'Ydata');
Z = real(samii);
%this plot equals the original one
figure(2)
contour(X,Y,Z)
colorbar
caxis([-2,1.5].*10^7)

%therefore the Z-Data is equal to the real part of your data
%X and Y are the indices of your data matrix
%set the threshold as desired
thresh = 0.1*10^7;

idx = find( abs(Z) < thresh);  %or what condition you like to use.
Z(idx) = NaN;

%filtered plot
figure(3)
contour(X,Y,Z)
colorbar
caxis([-2,1.5].*10^7)

给你:

在此处输入图像描述


关于您的所有评论,这些行应该是正确的方法:

Z = abs(samii);
idx = find(Z == 0);
Z(idx) = NaN;

%filtered plot
figure(1)
contour(Z);
colorbar
caxis([-2,1.5].*10^7)

返回:

在此处输入图像描述

如果这不符合您的需求,则您必须完全考虑一切;)

于 2013-11-18T14:33:14.690 回答
1

一个简单的方法,你可以改变一个矩阵元素的值,当它不等于 VALUE 时,把它改为 0。在配色方案中询问一个绿色/黄色的颜色数字 VALUE,说它是 VALUE=125。

for i=1:size(matrix,1)
   for j=1:size(matrix,2)
     if(matrix(i,j)==125)
        matrix(i,j) = 0;
   end;
end;
于 2013-11-17T14:03:18.230 回答