我有一个问题是在matlab中确定向量索引的方法。让我们看看我的问题。我有一个6位,包括2个部分:红色部分和蓝色部分。红色部分的大小为| S1 |蓝色部分是| S2 |(例如:| S1 | = 2且| S2 | = 4)。从0到 l 的原始位(6位)的索引。现在,我将红色部分翻转两次,蓝色部分翻转1次,使索引从0到j的下面的位。红色部分的大小为RF1 * | S1 |蓝色部分是RF2 * | S2 |。 (例如:RF1 = 2且RF2 = 1)。给定下面位(从0到j)的索引,我们可以通过图中的公式确定它们在原始位中的索引l。
例如,如果所选信息符号的索引是例如5,我们将其映射到5 mod 4 + 2 = 3(红色箭头) 但是,问题的索引是从0.你知道,matlab中向量的索引将从1开始。所以我将其改为如下图所示。我的问题是,如果使用第二个方案(索引来自1)通过matlab代码给出索引j,如何找到索引l。我做到了,但看起来很复杂
对于索引从1开始,我们可以看到我想将索引j = 6映射到l = 4 这是表格示例
这是我的代码
function l=find_index(j,S1,S2,RF1,RF2)
if j<(RF1*S1-1)
l=mod(j,S1);
if l==0
l=S1;
end
else
l=mod(j,RF2*S2)+S1 ;
if l==0
l=S2;
end
end
end
答案 0 :(得分:1)
也许这个?
function l=find_index(j,S1,S2,RF1,RF2)
if j<=(RF1*S1)
l=mod(j-1,S1)+1;
else
l=mod(j-RF1*S1-1,S2)+S1+1;
end
end
答案 1 :(得分:1)
首先S2
总是积极的,不是吗?这意味着l=mod(d,RF2*S2)+S2
永远不能等于零,因此不必进行检查。其次,你可以转换第一个mod
来包括支票,如下所示:l=mod(d-1,S1)+1;
所以把它全部放在一起:
if j<(RF1*S1-1)
l=mod(j-1,S1)+1;
else
l=mod(j,RF2*S2)+S2;
end
这可能是没有重新检查你的逻辑(我无法遵循)的正确答案。但是,如果由于某种原因你真的想要一个班轮:
l= (j<(RF1*S1-1))*(mod(j-1,S1)+1) + (j>=(RF1*S1-1))*(mod(j,RF2*S2)+S2);