Nested For Loop Equivalent using "Each" Statement in Q - kdb

I am learning the Q programming language because my new job will require it. I am doing some practice exercises and am wondering whether it is possible to imitate a nested loop using the "each" keyword.
For example, I know that:
f:{x*x}
a:(1;2;3;4;5)
f each a -> 1 4 9 16 25j
However, lets say for instance that I want to imitate a nested for loop to multiply the values of two lists. If we have:
a:(1;2;3;4;5)
b:(1;2;3;4;5)
In conventional java, this would be done by:
for(int i = 0; i < a.length; i++) {
for(int j = 0; j < b.length; j++) {
System.out.println(a[i]*b[j]);
}
}
Is it possible to imitate this nested for loop structure using "each" in q?

You can achieve this using iterators (formerly adverbs) in kdb
EG
a*/:b // Each Right
Will multiply each element of b by every element of a. In this case it would be as if you were iterating through b in your outer loop and a in your inner loop.
You could flip this to
a*\:b // Each Left
Which would have a in your outer loop and b in your inner loop.
If a and b are the same length and you would like to multiply element-wise then you can do a simple
a*b
For more on iterators:
https://code.kx.com/q/wp/iterators/

Related

What is the standard way to loop over the elements of multi-dimensional array of an object?

foreach(a.b[i]) begin
foreach(a.b[i][j]) begin
foreach (a.b[i][j].c[k]) begin
d = a.b[i][j].c[k];
end
end
end
a is a class, b is an object of a separate class e in class a, c is a member of class e which is being accessed through b and d is variable being assigned the value present in c.
I am getting a syntax error in first line itself. What is the correct way to loop over the elements of the multi-dimensional array b?
As per section 12.7.3 of the IEEE 1800-2017 LRM, the proper syntax to loop over your multi-dimensional array is:
foreach(a.b[i, j]) begin
foreach (a.b[i][j].c[k]) begin
d = a.b[i][j].c[k];
end
end

how to convert c/c++ loop containing two initial variables to matlab loop

i need to convert a C for loop with 2 variables ( see 2nd loop in provided code ) to MATLAB..
for(i=2; i<=count; i++)
for(j=i-1, n=1; n<=count+1-i; j+=2, n++)
{
table[j][i]=table[j+1][i-1] - table[j-1][i-1];
}

Make the basis of a function from nest loop outer components

I have a segment of code where a composition of nested loops needs to be run at various times; however, each time the operations within the nested loops are different. Is there a way to make the outer portion (loop composition) somehow a functional piece, so that the internal operations are variable. For example, below, two code blocks are shown which both use the same loop introduction, but have different purposes. According to the principle of DRY, how can I improve this, so as not to need to repeat myself each time a similar loop needs to be used?
% BLOCK 1
for a = 0:max(aVec)
for p = find(aVec'==a)
iDval = iDauVec{p};
switch numel(iDval)
case 2
r = rEqVec(iDval);
qVec(iDval(1)) = qVec(p) * (r(2)^0.5 / (r(1)^0.5 + r(2)^0.5));
qVec(iDval(2)) = qVec(p) - qVec(iDval(1));
case 1
qVec(iDval) = qVec(p);
end
end
end
% BLOCK 2
for gen = 0:max(genVec)-1
for p = find(genVec'==gen)
iDval = iDauVec{p};
QinitVec(iDval) = QinitVec(p)/numel(iDval);
end
end
You can write your loop structure as a function, which takes a function handle as one of its inputs. Within the loop structure, you can call this function to carry out your operation.
It looks as if the code inside the loop needs the values of p and iDval, and needs to assign to different elements of a vector variable in the workspace. In that case a suitable function definition might be something like this:
function vec = applyFunctionInLoop(aVec, vec, iDauVec, funcToApply)
for a = 0:max(aVec)
for p = find(aVec'==a)
iDval = iDauVec{p};
vec = funcToApply(vec, iDval, p);
end
end
end
You would need to put the code for each different operation you want to carry out in this way into a function with suitable input and output arguments:
function qvec = myFunc1(qVec, iDval, p)
switch numel(iDval)
case 2
r = rEqVec(iDval); % see note
qVec(iDval(1)) = qVec(p) * (r(2)^0.5 / (r(1)^0.5 + r(2)^0.5));
qVec(iDval(2)) = qVec(p) - qVec(iDval(1));
case 1
qVec(iDval) = qVec(p);
end
end
function v = myFunc2(v, ix, q)
v(ix) = v(q)/numel(ix);
end
Now you can use your loop structure to apply each function:
qvec = applyFunctionInLoop(aVec, qVec, iDauVec, myFunc1);
QinitVec = applyFunctionInLoop(aVec, QinitVec, iDauVec, myFunc2);
and so on.
In most of the answer I've kept to the same variable names you used in your question, but in the definition of myFunc2 I've changed the names to emphasise that these variables are local to the function definition - the function is not operating on the variables you passed in to it, but on the values of those variables, which is why we have to pass the final value of the vector out again.
Note that if you want to use the values of other variables in your functions, such as rEqVec in myFunc1, you need to think about whether those variables will be available in the function's workspace. I recommend reading these help pages on the Mathworks site:
Share Data Between Workspaces
Dynamic Function Creation with Anonymous and Nested Functions

Maximum value of fields of nested structure

I have following structure:
S.s1.val = 1;
S.s2.val= 5;
S.s3.val= 4;
...
S.s10.value = 3;
How can I find max value of all val fields without using loops. And what is general solution to apply functions to all nested structure fields?
There is no general solution, but one way to think of is structfun to collect the data you want to process to an array.
maxval = max( structfun(#(x) x.val, S) )
Internally structfun works serially like a loop, so if you're really into speed, don't use structs (or cell arrays).

Coffeescript iteration over array of objects does not compile as expected

I would like to perform an iteration over an array of objects. Instead of writing
for item in items
for k, v in item
# Do Something
I would like to do something similar to this
for k,v of item in items
# Do something
Which based on the compiled output is not supported:
var k, ref, ref1, v, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
ref1 = (ref = indexOf.call(items, item) >= 0) != null ? ref : [];
for (k in ref1) {
v = ref1[k];
# Do something
}
Is there any other comprehension-like operation through which I can perform this shortcut?
EDIT: I can refer to specific keys in the object by doing
for { k1, k2 }, i in items
# Do something
For the sake of the question, assume the keys are dynamic
No you can't. Following coffeescript's golden rule “it's just JavaScript”, consider looking at the source where a for loop gets translated. You will need two Javascript fors and you only can get one from a coffescript for (the for gets inserted in line 2079).
The javascript result you want to have is something like this:
for(_i…;…;…){
var _x = items[_i];
for(k in _x){
var v = _x[k]
…
}}
There are only two ways to get a javascript for loop (apart from the prewritten ones, like in class definitions): On “Range compilation”, which always gives a for(…;…;…) loop (which contructs an array inside a closure that will be returned) and for the for construct.
Your example to access single keys works because you are using some very special case of destructuring assignment. What you would need is a destructuring that extracts key-value pairs and there is none. If you look at the compiled example constructs like this get translated into a=items[i].a so such that there is no iteration. You even can omit the ,i:
for {a} in items
#iterate over the .a values of items
If your #Do something is just one line, you can put your fors on one line, but I personally think it doesn't increase the readability.
console.log [k,v] for k,v of i for i in items