2017-06-16 9 views
0

を生成するために、私は2つのベクトルを持っているなど第三ベクトルを形成するために、他の間で1を配布したい:クロスを連結要素の第三

V1 = (a,b,c) 
V2 = (d,e,f) 

結果:

V3 = (ad,ae,af,bd,be,bf,...cf) 'nine total elements 

のみを私はそれを行う方法を知っている方法はループです。私は、さまざまな方法で数多くの検索を試みましたが、ループを避けるために、「1行のコード」ソリューションを見つけることはできません。

私がそれを見逃している場合は、私にそれを指摘してください。私は正しい検索パラメータを見つけられなかったかもしれません。それが不可能な場合は、私の悲惨さに私を惜しまと私に教えてください

:,,,(

答えがある場合は、それを共有してくださいRで

+2

まず特定の言語を選んでください。 –

+0

'ad'と他の2つの実数の乗算、2つの文字列の連結、順序付けされたペアへの結合などがありますか? –

+0

'V3'は実際には' V1'と 'V2'の行列積です(行列が行単位で格納されている場合)、要素が' int'、 'float'、または' double'と仮定すると、 [** Eigen library **](http://eigen.tuxfamily.org/index.php?title=Main_Page)を見てください。 Intels x86アーキテクチャでは、パフォーマンスを得るために[SSE命令](https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions)を使用します(少なくとも使用できます)。これは** C++ **で実装されており、** R **と** Python **の中でさまざまな言語のバインディングを持っています。 – Scheff

答えて

0

:。。
as.vector(sapply(V1, function(x) paste0(x, V2)))

C++で
0

std::vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] }; 

...しかし、私は通常、複数の行でそれをフォーマットします

01。

#include <iostream> 
#include <vector> 
using namespace std; 

template <typename ELEM> 
ostream& operator << (ostream &out, const vector<ELEM> &vec) 
{ 
    const char *sep = "{ "; 
    for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; } 
    return out << " }"; 
} 

int main() 
{ 
    vector<double> v1{ 1.0, 2.0, 3.0 }, v2{ 4.0, 5.0, 6.0 }; 
    // in one line: 
    vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] }; 
    // output: 
    cout << v3 << endl; 
    // done 
    return 0; 
} 

出力:

{ 4, 5, 6, 8, 10, 12, 12, 15, 18 } 

ideone上でテストされています。)

おかげで、ロリーDaulton、インスピレーションのためのMCVEとして

。 Cの++では、私もこれを行うことができます。

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

string operator*(const string &str1, const string &str2) 
{ 
    return str1 + str2; 
} 

template <typename ELEM> 
ostream& operator << (ostream &out, const vector<ELEM> &vec) 
{ 
    const char *sep = "{ "; 
    for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; } 
    return out << " }"; 
} 

int main() 
{ 
    vector<string> v1{ "a", "b", "c" }, v2{ "d", "e", "f" }; 
    // in one line: 
    vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] }; 
    // output: 
    cout << v3 << endl; 
    // done 
    return 0; 
} 

出力:

{ ad, ae, af, bd, be, bf, cd, ce, cf } 

を少し改善した後、それも混合型のために動作します:

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

string operator*(const string &arg1, int arg2) 
{ 
    string ret; for (int i = 0; i < arg2; ++i) ret += arg1; 
    return ret; 
} 

template <typename ELEM> 
ostream& operator << (ostream &out, const vector<ELEM> &vec) 
{ 
    const char *sep = "{ "; 
    for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; } 
    return out << " }"; 
} 

int main() 
{ 
    vector<string> v1{ "a", "b", "c" }; vector<int> v2{ 1, 2, 3 }; 
    // in one line: 
    vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] }; 
    // output: 
    cout << v3 << endl; 
    // done 
    return 0; 
} 

出力:

{ a, aa, aaa, b, bb, bbb, c, cc, ccc } 
+0

あなたの答えはありがとうございます。私は明確さの欠如についてお詫びしますが、私は3つのベクトルが連結を必要とする文字列であることをより具体的に述べておきます。 – Michaelk87

+0

さまざまな言語の余分な情報も私にとって役に立ちます。時間と労力が浪費されるわけではありません。 – Michaelk87

+0

@ Michaelk87「完全に浪費されていません」と私は理解していません。 Rory DaultonのPythonソリューションでは、C++(2番目のサンプル)で文字列と文字列の連結について言及していますが、文字列の連結が実際に期待されているとは言いませんが。 (私は実際に何をしているのかは関数(x)に依存している可能性があるので、Rの解を除外しません) – Scheff

1

あなたは何の操作abを意味します。ここでは、2つの実数を乗算したいと仮定します。

Pythonでは、理解を使用できます。完全なコードスニペット。望んでいたよう

v1 = (2, 3, 5) 
v2 = (7, 11, 13) 
v3 = tuple(x * y for x in v1 for y in v2) 

v3の値が、その後

(14, 22, 26, 21, 33, 39, 35, 55, 65) 

です。 Pythonのリストが必要な場合は、コードが見やすくなります。使用するコードを連結などに変更する方法は明らかです。ここでは、文字列の連結のためのサンプルコードは、次のとおりです。

あなたはまた、(私はこの答えの最初のバージョンで使用される) itertoolsモジュールから product()を使用しますが、上記のことができ

('ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf') 

になり

v1 = ('a', 'b', 'c') 
v2 = ('d', 'e', 'f') 
v3 = tuple(x + y for x in v1 for y in v2) 

簡単ですね。

関連する問題