如何使用矩阵填充矩阵,将矩阵视为图表,将向量视为线

时间:2019-06-06 09:59:21

标签: matlab

考虑以下值

result=zeros(11,11);
line=(4:0.4:8);

将结果想象为11x11 X-Y图表纸。所以最初我们有一张空白的图表纸。就像在图表图中一样,我想在结果矩阵中填充line的值,以便在显示矩阵时获得向上倾斜的线。

考虑以下我想要的结果。

enter image description here

在这里,结果矩阵可以显示为图表纸,其原点在左下角。现在,对于X = 1,第(1)= 4行;对于X = 2,行(2)= 4.4,等等。

我写了下面的代码来达到目的。

result=zeros(11,11);
line=(4:0.4:8);

for i=1:length(line)
    temp=floor(line(i));
    result(length(line)-temp+1,i)=line(i);
end

有没有更有效的方法来实现此解决方案? (我将使用20000x20000矩阵,因此方法需要快速)

如注释中所建议,问题描述如下:

我可以说1000行。所有这些线具有不同的斜率和截距。我知道线的x范围和线的y范围。如果将这些线同时绘制在一个图上,那么我就无法从数据中推断出什么。生成的图像将如下所示:

enter image description here

关于此情节的推断不多。但是,如果我可以将这些信息保存在一个大矩阵中,则可以分析在特定X索引处通过的最大行数,并相应地进行进一步分析。

更多详细信息

我将Y轴离散化为1000个等距间隔: 示例代码如下:

range=max(data)-min(data);
percent=0.20;
outerRange= max(data)+range*percent - (min(data)-range*percent);
outerRangeValues=min(data)-range*percent:outerRange/1000:max(data)+range*percent;

即使一条特别陡峭的线完全有可能穿过单列中的2行或更多行,我也只会选择一行中要填充的行之一。这可以通过对特定列的行值取平均值,然后将单个行作为该列的值来实现。

1 个答案:

答案 0 :(得分:4)

您可以使用sub2ind保持向量矢量化并避免循环。

这个想法是找到所有必须修改的行和列索引。

对于X轴来说很容易,它只是每列一个,因此X索引将为1,2,3,...,np

对于Y轴,必须将line值合并到Y网格中。由于索引必须是整数,因此您必须将浮点值转换为整数。为此,您可以在roundfloorceil之间进行选择。每个值将放置一些稍有不同的值,由您决定哪种舍入方法对您的问题有意义。

一旦有了索引[row_indices,column_indices],就可以使用sub2ind将它们转换为线性索引到矩阵中,然后将line的值分配给这些线性索引。

在代码中:

line=(4:0.4:8);                     % your input (line vector)

np = numel(line) ;                  % determine size of matrix/chart

% identify column and row indices to modify
idCol = 1:np ;
idRow = fliplr( round( line ) ) ;   % choose "round", "floor" or "ceil"

% build the result
result              = zeros(np);
linearInd           = sub2ind( [np,np], idRow, idCol ) ;
result(linearInd)   = line ;

给你:

>> result
result =
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   7.2 7.6 8
0   0   0   0   0   0   6.4 6.8 0   0   0
0   0   0   5.2 5.6 6   0   0   0   0   0
0   4.4 4.8 0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0