我希望使用我开发的分区公式,通过绘制一组点来可视化使用Zone Bit Recording格式化的硬盘盘片的扇区。
盘片是半径
主要思想是,当向外走,每一定数量的轨道 N TZ 时,周长变得足够大,以便在轨道上增加一个扇区并仍然保持新位高于最小值。这表示为
N TZ =⌈ L S0 / W ⌉
这反过来允许计算区域的数量 N Z 为
N Z =⌈
赛道区域 N 为
Z ( N )=⌊ N / N TZ ⌋,
轨道上的扇区数 N 为
N S ( N )= N S0 + ž的(名词的)
该剧本的这一部分是将以前的公式直接翻译成绘图:
hold on; axis("equal");
parfor z = 0:NZ
NS = NS0 + z;
G = 2*pi/NS:2*pi/NS:2*pi;
R(1:NS) = [25 + W.*z.*TZ:W:25 + W.*TZ.*(z+1)];
polar(G,R,'.r');
end
hold off;
它并不总是在极坐标图中返回某些内容,有时Octave会在较大的输入上冻结/崩溃。
我的主要问题是我对Octave中的矩阵不够熟悉以优化这一点(我在C和装配上削减了牙齿),以及R
和G
必须具备的事实相同数量的元素。使用R(1:NF)
初始化对我来说已经是一个巨大的理解。我确信Octave / Gnuplot能够处理这个脚本会产生的数百万(可能是数亿)点,但是告诉它以有效的方式这样做是超出我的。
更新:我意识到上面的代码甚至不起作用。这是一个更新版本,它可以生成合理的输出并且不会在保守输入上崩溃,但仍然不会产生精确的图。
for z = 0:NZ
NF = NFm + z;
G(1:TZ,1:NF) = 2*pi*ones(TZ,1)*[1:NF]/NF;
R(1:TZ,1:NF) = (25 + W*(z*TZ+[1:TZ]'))*ones(1,NF);
polar(G,R,'.r');
clear R G;
end
答案 0 :(得分:0)
事实证明代码一直都是正确的:
hold on; axis("equal");
for z = 0:NZ
NF = NFm + z;
G(1:TZ,1:NF) = 2*pi*ones(TZ,1)*[1:NF]/NF;
R(1:TZ,1:NF) = 25 + W*(z*TZ+[1:TZ]'*ones(1,NF));
polar(G,R,'.r');
clear R G;
end
hold off;
注意开头的hold on;
。假设每次重绘图形,我会运行相同的脚本几次,导致之前的错误结果被绘制出来。
在我自己尝试矩阵运算符和索引并阅读几个(读取:很多)源代码后,我也编写了代码。
道德:你永远不能研究太多。