映射向量

3
有没有一种很好的方法来映射向量?下面是一个例子:
vec0 = [0,0,0,0,0,0,0,0,0,0,0]
vec1 = [1,4,2,7,3,2]
vec2 = [0,0,0,0,0,0,0,0,0]
vec2 = [7,2,7,9,9,6,1,0,4]
vec4 = [0,0,0,0,0,0]

mainvec =
[0,0,0,0,0,0,0,0,0,0,0,1,4,2,7,3,2,0,0,0,0,0,0,0,0,0,7,2,7,9,9,6,1,0,4,0,0,0,0,0,0]

假设mainvec不存在(我只是向您展示它,以便您了解所考虑的一般数据结构。

现在假设我想要mainvec(12),这将是4。有没有好的方法来映射这些向量的调用,而不仅仅是将它们拼接成一个mainvec?我意识到我可以制作一堆if语句来测试mainvec的索引,然后根据调用在一个向量中的位置进行每个调用的偏移,因此例如:

mainvec(12) = vec1(1)

我可以通过以下方式实现:

mainvec(index)
if (index >=13)
    vect1(index-11);

我想知道是否有一种简洁的方法可以不使用if语句来完成这个任务。有什么想法吗?


我最终使用了一个映射来解决这个问题。最后,我本来想要连接向量,但编译程序所需的时间太长了(我的向量实际上加起来有2^32个元素)。实际上元素的索引与数据在我的设计中同样重要,因此我只是创建了一个动态增长的映射表。当我需要访问位置10230230处的某些内容时,我只需访问包含该键的元素即可。 - Dan Snyder
4个回答

1
我会使用锯齿数组。
你仍然需要循环,但是你可以保持不冗余的单独向量:
var mainvec = new int[][]{vec0, vec1, vec2, vec3, vec4};

int desiredInd = 12, totalInd = 0, rowInd = 0, result;

while(rowInd < mainvec.Length && (totalInd + mainvec[rowInd].Length) <= desiredInd)
{ 
    totalInd += mainvec[rowInd++].Length;
}

if(rowInd < mainvec.Length && (desiredInd - totalInd) < mainvec[rowInd].Length)
{
  result = mainvec[rowInd][desiredInd - totalInd];
}

1

看起来你正在进行基本的列表连接,这种情况下,Concat函数似乎是最直接的方法。在实际代码中,可以这样写:

var vec0 = new[] {0,0,0,0,0,0,0,0,0,0,0};
var vec1 = new[] {1,4,2,7,3,2};
var vec2 = new[] {0,0,0,0,0,0,0,0,0}; 
var vec3 = new[] {7,2,7,9,9,6,1,0,4};
var vec4 = new[] { 0, 0, 0, 0, 0, 0 };

var mainvec = vec0.Concat(vec1).Concat(vec2).Concat(vec3).Concat(vec4).ToList();
mainvec[12] == 1;

我不太确定你想做什么的背景,所以可能有更直接的方法来完成,但基于你已经拥有的东西,这对我来说似乎是最简单的。


1
你是否在寻找类似这样的东西?
using System.Collections.Generic;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] vec0 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            int[] vec1 = { 1, 4, 2, 7, 3, 2 };
            int[] vec2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            int[] vec3 = { 7, 2, 7, 9, 9, 6, 1, 0, 4 };
            int[] vec4 = { 0, 0, 0, 0, 0, 0 };
            List<int> temp = new List<int>();
            temp.AddRange(vec0);
            temp.AddRange(vec1);
            temp.AddRange(vec2);
            temp.AddRange(vec3);
            temp.AddRange(vec4);
            int[] mainvec = temp.ToArray();
        }
    }
}

@ckramer:使用Ling可以得到相同的结果 var mainvec = vec0.Concat(vec1).Concat(vec2).Concat(vec3).Concat(vec4).ToArray() - Waleed A.K.

1
我会创建一个类,该类将接收长度数组,并具有一种方法,可以为给定的组合列表中的索引提供数组编号和数组内索引。
它将被一个类包装,该类将获取对实际数组的引用和一个索引器,以将您带到正确的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接