八度 - 优化可视化的点绘图

时间:2017-02-28 20:30:12

标签: optimization octave

我希望使用我开发的分区公式,通过绘制一组点来可视化使用Zone Bit Recording格式化的硬盘盘片的扇区。

模特&方程

盘片是半径 sub <0> &amp; R 1 ,包含 N T 同心轨道,其间距为 W (所以名词<子>Ť 的=⌊( - [R <子> 1 的 - 的 [R <子> 0 的)/W⌋和扇区半径 N R N R 0 + w ^ * 名词的);这些部门向外编号。制造过程允许最小径向位间距 L B ,因此最小径向扇区间距 <子>取值 的= 8 *的→<子>乙 的*(取值 + <我>电子的)(考虑 S 为512字节)。因为 L S 不一定要划分 R 0 ,所以最小扇区数(即在最里面的轨道上) )实际上是 N S0 =⌊ R 0 / L S ⌋,因此实际最小扇区间距为 L S0 = R 0 / ñ<子>取值

主要思想是,当向外走,每一定数量的轨道 N TZ 时,周长变得足够大,以便在轨道上增加一个扇区并仍然保持新位高于最小值。这表示为

N TZ =⌈ L S0 / W

这反过来允许计算区域的数量 N Z

N Z =⌈ N T / N TZ 的⌉,

赛道区域 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和装配上削减了牙齿),以及RG必须具备的事实相同数量的元素。使用R(1:NF)初始化对我来说已经是一个巨大的理解。我确信Octave / Gnuplot能够处理这个脚本会产生的数百万(可能是数亿)点,但是告诉它以有效的方式这样做是超出我的。

This is an example of what the result should look like.

更新:我意识到上面的代码甚至不起作用。这是一个更新版本,它可以生成合理的输出并且不会在保守输入上崩溃,但仍然不会产生精确的图。

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

1 个答案:

答案 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;。假设每次重绘图形,我会运行相同的脚本几次,导致之前的错误结果被绘制出来。

在我自己尝试矩阵运算符和索引并阅读几个(读取:很多)源代码后,我也编写了代码。

道德:你永远不能研究太多。