考虑以下值
result=zeros(11,11);
line=(4:0.4:8);
将结果想象为11x11 X-Y图表纸。所以最初我们有一张空白的图表纸。就像在图表图中一样,我想在结果矩阵中填充line的值,以便在显示矩阵时获得向上倾斜的线。
考虑以下我想要的结果。
在这里,结果矩阵可以显示为图表纸,其原点在左下角。现在,对于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范围。如果将这些线同时绘制在一个图上,那么我就无法从数据中推断出什么。生成的图像将如下所示:
关于此情节的推断不多。但是,如果我可以将这些信息保存在一个大矩阵中,则可以分析在特定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行或更多行,我也只会选择一行中要填充的行之一。这可以通过对特定列的行值取平均值,然后将单个行作为该列的值来实现。
答案 0 :(得分:4)
您可以使用sub2ind
保持向量矢量化并避免循环。
这个想法是找到所有必须修改的行和列索引。
对于X
轴来说很容易,它只是每列一个,因此X
索引将为1,2,3,...,np
。
对于Y
轴,必须将line
值合并到Y
网格中。由于索引必须是整数,因此您必须将浮点值转换为整数。为此,您可以在round
,floor
和ceil
之间进行选择。每个值将放置一些稍有不同的值,由您决定哪种舍入方法对您的问题有意义。
一旦有了索引[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