如何突出显示或识别矩阵中具有特定值的列?

时间:2015-09-23 07:28:16

标签: matlab matrix identify

我想在MATLAB中突出显示或标识具有特定值的矩阵中的列。假设我有一个矩阵A = [1 0 1 1 0 1; 1 1 0 0 0 1; 1 0 1 1 0 1; 0 1 1 0 0 1]

上述矩阵的结果是第5列,因为它包含全零。我也想知道是否可以突出显示生成的列以进行识别。请帮我。我有一个非常大的矩阵来应用这个原理。

3 个答案:

答案 0 :(得分:4)

如何合并findall来获取全零列like this的列索引?

A = [1 0 1 1 0 1; 1 1 0 0 0 1; 1 0 1 1 0 1; 0 1 1 0 0 1];

ind = find(all(A==0,1))
ind = 
    5

all的第二个输入参数是指定它沿着第一个维度,即行。这里没有必要,但我发现这是一个很好的做法,因为你总是确定它是正确的维度。如果存在可能获得1xn向量而不是mxn的情况,这一点尤为重要。

创建彩色矩阵:

这是一个黑客,我不一定推荐它,但如果你真的想在MATLAB中这样做,这是另一种选择。另外,我认为在这样做时你可能会学到很多关于MATLAB的知识,所以它可能值得花时间。

您可以使用imagesc创建一个包含所有值1的彩色图表,但第5列中的值为0(或相反,无关紧要)。这将给出仅有两种颜色的图,一种用于1的值,另一种用于0。您可以使用colormap选择所需的颜色。然后,您create a mesh确定要显示的所有值的位置,使用num2str将矩阵转换为字符串,并将其全部合并。您需要尝试一些以获取正确的位置,因为您可能希望行之间的填充少于列。您可以使用this answer作为指南。最后,remove the axes。如果您阅读并尝试理解所引用答案的每一行,则应该相当简单。

简单方法:

我有一个非常大的矩阵......“。这样的矩阵通常不是一个好主意包含在报告中。但是,如果你真的想,我实际上建议你从variable explorer复制粘贴它。并且进入MS Excel(如果您不止这样做,请使用xlswrite)。由于您知道要为哪个列着色,因此单击“颜色按钮”应该相当简单。

答案 1 :(得分:4)

以下显示<命令窗口中的矩阵以及粗体中的匹配列。可能有多个匹配列,并且任意列值可以匹配。

A = [1 0 1 0 0 1; 1 1 0 1 0 1; 1 0 1 0 0 1; 0 1 1 1 0 1]; %// matrix
c = [0;1;0;1]; %// column to be matched
nn = find(all(bsxfun(@eq, A, c),1)); %// indices of matching columns
s = cellstr(num2str(A)); %// cell array of strings, one for each row; all same length
for n = nn %// for each matching column, with index n
    s = regexprep(s, '\S+', '<strong>$0</strong>', n); %// make bold n-th value of each cell
end
s = vertcat(s{:}); %// convert back into a char array; all strings have the same length
disp(s); %// display

此示例中的结果是

enter image description here

答案 2 :(得分:2)

用红色突出显示(stderr)

仅仅为了概念验证,你可以在命令窗口中突出显示你的一些数据,虽然我不建议实际这样做。请考虑以下代码:

A=randi(10,8);
%ind = find(all(A==0,1),1) %for actual data
ind = 5; %manual choice for demonstration

for k=1:size(A,1)
    fprintf('%5d   ',A(k,1:ind-1));
    fprintf(2,'%5d   ',A(k,ind));
    fprintf('%5d   ',A(k,ind+1:end));
    fprintf('\n');
end

首先,我们创建一个虚拟矩阵用于演示目的,并选择列ind进行突出显示。然后我们在A中逐行进行,我们使用fprintf(...)以给定格式编写非突出显示的值,然后使用fprintf(2,...)以红色写入stderr ,然后写下该行的其余部分,然后换行。请注意,由于某种原因,fprintf(2,...)不会突出显示最终字符,我猜是因为通常这是\n,并且没有人注意到那里突然显示突出显示。

此外,您可以使用fprintf内的格式来满足您的需求。如果需要打印浮点数,'%10.8f'之类的内容可能会起作用。或'%g'。重点是为了获得漂亮的列而具有固定的宽度+精度。

为了完整起见,您可以使处理多个可突出显示的列更加混乱:

A=randi(10,8);
%ind = find(all(A==0,1)) %for actual data
ind=[5 2];

fprintf('A = \n\n');
for k1=1:size(A,1)
    for k2=1:size(A,2)
        if ismember(k2,ind)
            fprintf(2,'%5d   ',A(k1,k2));
        else
            fprintf('%5d   ',A(k1,k2));
        end
    end
    fprintf('\n');
end
fprintf('\n');

我还添加了一些额外的打印输出,使其更漂亮。结果: red highlight

用蓝色突出显示(链接)

作为事后的想法,在与Luis Mendo进行了一些讨论之后,我认为在我们进行一些讨论时,它值得过度。您可以将数字转换为带蓝色和下划线的超链接,利用<a href="URL">link</a>disp中实现的fprintf HTML标记的内置解析。这是相应的代码:

A=randi(10,8);
ind=[5 2];

fieldlen=5; %width of output fields, i.e. 5 in '%5d'

fprintf('A = \n\n');
for k1=1:size(A,1)
    for k2=1:size(A,2)
        if ismember(k2,ind)
            fprintf([repmat(' ',1,fieldlen-length(num2str(A(k1,k2)))) '<a href="matlab:">%d</a>   '],A(k1,k2));
        else
            fprintf('%5d   ',A(k1,k2));
        end
    end
    fprintf('\n');
end
fprintf('\n');

这会将突出显示的列的元素转换为'<a href="matlab:">3</a>'形式的字符串,示例值为3.

此处的另一个技巧是以matlab:开头的超链接被解析为正确的matlab命令,当您单击链接时会激活这些命令。您可以在命令窗口中键入disp('<a href="matlab:help help">link</a>')来尝试它。通过设置<a href="matlab:">...</a>,我们确保当有人点击现在链接值突出显示的数字时没有任何反应。

在技术说明中:我们只想在链接中包含实际数字(而不是前面的空格),因此我们必须手动检查我们要打印的字符串的长度(使用{{1} })并在数字前手动包含其余空格。这是通过我在开头设置的参数length(num2str(A(k1,k2)))来完成的:这指定了每个打印字段的总宽度,即如果我们最初有fieldlen,那么我们需要设置fprintf('%5d',...)同样的效果。结果: enter image description here