Картография векторов - PullRequest
3 голосов
/ 15 июня 2010

Есть ли хороший способ отобразить векторы?Вот пример того, что я имею в виду:

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. Есть идеи?

Ответы [ 4 ]

1 голос
/ 15 июня 2010

Вы ищете что-то подобное?

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();
        }
    }
}
1 голос
/ 15 июня 2010

Я бы создал класс, который получал бы массив длин, и имел бы метод, чтобы дать вам номер массива и индекс внутри массива для данного индекса в объединенном списке.

Он будет обёрнут классом, который получит ссылки на фактические массивы и индексатор, чтобы привести вас к нужному элементу.

1 голос
/ 15 июня 2010

Похоже, вы выполняете базовую конкатенацию списков, и в этом случае функция 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 голос
/ 15 июня 2010

Я бы использовал зубчатый массив.

Вы все еще должны иметь цикл, но вы можете сохранить отдельные векторы без избыточности:

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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...