I have 2 vectors and want to distribute one across the other to form a third vector like:
V1 = (a,b,c)
V2 = (d,e,f)
Result:
V3 = (ad,ae,af,bd,be,bf,...cf) 'nine total elements
The only way I know how to do it is by looping. I've tried searching a number of different ways, and can't find a 'one line of code' solution, to avoid looping.
If I've missed it, please point me to it. I may have not found the right search parameters.
If it is not possible, please spare me my misery and let me know :,,,(.
If there is an answer, please share it.
You do not make clear what operation ab
means. I'll assume here you want to multiply two real numbers.
In Python, you can use a comprehension. Here a complete code snippet.
v1 = (2, 3, 5)
v2 = (7, 11, 13)
v3 = tuple(x * y for x in v1 for y in v2)
The value for v3
is then
(14, 22, 26, 21, 33, 39, 35, 55, 65)
as wanted. If you want a Python list, the code looks easier: use
v3 = [x * y for x in v1 for y in v2]
It will be obvious how to change the operation to concatenation or anything else desired. Here is sample code for concatenation of strings:
v1 = ('a', 'b', 'c')
v2 = ('d', 'e', 'f')
v3 = tuple(x + y for x in v1 for y in v2)
which results in
('ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf')
You could also use product()
from the itertools
module (which I used in the first version of this answer) but the above seems easier.
In R:
as.vector(sapply(V1, function(x) paste0(x, V2)))
In C++:
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] };
...though, I usually would format it in multiple lines.
As MCVE:
#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;
}
Output:
{ 4, 5, 6, 8, 10, 12, 12, 15, 18 }
(Tested on ideone.)
Thanks, Rory Daulton, for the inspiration. In C++, I can do this also:
#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;
}
Output:
{ ad, ae, af, bd, be, bf, cd, ce, cf }
After a little improvement, it will even work for mixed types:
#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;
}
Output:
{ a, aa, aaa, b, bb, bbb, c, cc, ccc }