簡體   English   中英

如何更有效地訪問列表中向量中的元素?

[英]How to access elements in vectors in Lists more efficiently?

我有一個問題,我想以一種特殊的方式合並所有相同類型的向量列表。 我希望所得矢量的第一個元素成為列表中第一個矢量的第一個元素,第二個元素應為第二個矢量的第一個元素,第三個,第三個的第一個,依此類推,直到n其中n是我列表的長度,則元素n + 1應該是第一個向量的第二個元素。 重復直到完成。

目前,我正在這樣做:

CharacterVector measure(nrows * expansion);
CharacterVector temp(nrows);
for(int i=0; i < measure.size(); i++){
  temp = values[i % expansion];
  measure[i] = temp[i / expansion];
}
return(measure);

其中valuesCharacterVectorsList 這似乎效率極低,每次都會覆蓋temp但是我不知道一種更好的方法來訪問values的元素。 我不太了解C ++,但我認為必須有更好的方法。

任何幫助都將不勝感激!

編輯:在“所有矢量values具有相同的長度的nrowsvalues具有expansion在它的元件。

您需要的是ListOf<CharacterVector>類。 顧名思義,它表示一個僅包含CharacterVector的R列表。

下面的代碼使用它從列表中提取每個字符向量的第二個元素。 應該不難讓它適應您的擴展算法,但是如果沒有更多上下文,您的示例就無法重現。

#include <Rcpp.h>
using namespace Rcpp ;

// [[Rcpp::export]]
CharacterVector second( ListOf<CharacterVector> values ){
    int n = values.size() ;
    CharacterVector res(n);
    for(int i=0; i<n; i++){
      res[i] = values[i][1] ;
    }
    return res ;
}

然后,您可以sourceCpp並嘗試一些示例數據:

> data <- list(letters, letters, LETTERS)

> second(data)
[1] "b" "b" "B"

現在關於您的假設:

這似乎效率極低,每次都覆蓋溫度

創建CharacterVector的速度非常快,沒有數據的深層副本,因此,這首先不應該成為問題。

您可以預先構造向量,並且可以輕松知道第一個向量的元素應該移到哪個位置。即:measure [0],measure [n],measure [n * 2]等。其中n = mylist.size() 。 在這里,我當然假設列表中的每個向量都具有相等的大小。 未經測試的代碼:

CharacterVector measure(nrows * expansion);
for(int i=0; i < values.size(); ++i)
{
  CharacterVector& temp = values[i];
  int newPosition = i;
  for( int j=0; j < temp.size(); ++j)
  {
    measure[newPosition ] = temp[j];
    newPosition += expansion;
  }
}

return(measure);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM