我想在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列,因为它包含全零。我也想知道是否可以突出显示生成的列以进行识别。请帮我。我有一个非常大的矩阵来应用这个原理。
答案 0 :(得分:4)
如何合并find
和all
来获取全零列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
此示例中的结果是
答案 2 :(得分:2)
仅仅为了概念验证,你可以在命令窗口中突出显示你的一些数据,虽然我不建议实际这样做。请考虑以下代码:
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');
作为事后的想法,在与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',...)
同样的效果。结果: