perl; what is this? for(1..$scalar_name) - perl

I'm reading a perl code to distill what it's doing, but can't figure out what 1..$scalar_name in these lines is doing
my $scalar_name = scalar #array_name;
push #zeroes, 0 for(1..$scalar_name);
Thank you!

Two dots .. is a range operator.
Binary ".." is the range operator, which is really two different operators depending on the context. In list context, it returns a list of values counting (up by ones) from the left value to the right value. If the left value is greater than the right value then it returns the empty list. The range operator is useful for writing foreach (1..10) loops and for doing slice operations on arrays.
Your code takes the number of elements of the array and creates a new array with the same number of zeros.

Related

Write a recursive function to find the smallest element in a vector(MATLAB)

Write a recursive function to find the smallest element in a vector.
We can not use loops but can use if statements.
Using RECURSION is a must.
I Could Not think of any solution, the main problem was if I define a function then I have to give it some value and if I do so then whenever recursion occur it will again reset the value of that variable.
function miminimumis=minimumval(k)
aa=k(1);
k=k(k<k(1));
if length(k)==0
miminimumis=aa;
else
% this line gives the recursion
miminimumis=minimumval(k);
end
end
here we create a new array which consists of elements only smaller than the first element. if this array is empty then it means that first element is min, if not we do the same for the new array unless we reach an empty array. the recursion is provided by using the same function in the definition of the function.
Solutions which in the worst case reduce the problem size by 1 will cause the recursive stack to have O(length(array)) growth. An example of this would be when you filter the array to yield values less than the first element when the array is in descending order. This will inevitably lead to stack overflow for sufficiently large arrays. To avoid this, you want to use a recursion which splits the problem of size n into two subproblems of size n/2, yielding O(log(length(array))).
I'm not a Matlab user/programmer, so I'll express the algorithm in pseudo-code. The following assumes that arrays are 1-based and that there is a built-in function min(a,b) which yields the minimum of two scalars, a and b. (If not, it's easy to replace min() with if/else logic.)
function min_element(ary) {
if length(ary) == 1 {
return ary[1]
}
split ary into first_half, second_half which differ in length by no more than 1
return min( min_element(first_half), min_element(second_half) )
}
This could alternatively be written using two additional arguments for the lo_index and hi_index to search between. Calculate the midpoint as the integer average of the low and high indices, and make the two recursive calls min_element(ary, lo_index, mid) and min_element(ary, mid+1, hi_index). The base condition is when lo_index == hi_index, in which case you return that element. This should be faster, since it uses simple integer arithmetic and avoids creating sub-arrays for the subproblems. It has the trade-off of being slightly less friendly to the end user, who has to start the process by calling min_element(ary, 1, length(ary)).
If the stack limit is 500, you'll be limited to arrays of length < 500 using linear stack growth algorithms. With the divide-and-conquer algorithm described above, you won't get stack overflow unless you have an array of length ~2500, much bigger than any array you could actually create.

Concat postgresql tsvectos without position offset

Based on https://www.postgresql.org/docs/13/textsearch-features.html
tsvector || tsvector
The tsvector concatenation operator returns a vector which combines the lexemes and positional information of the two vectors given as arguments. Positions and weight labels are retained during the concatenation. Positions appearing in the right-hand vector are offset by the largest position mentioned in the left-hand vector, so that the result is nearly equivalent to the result of performing to_tsvector on the concatenation of the two original document strings. (The equivalence is not exact, because any stop-words removed from the end of the left-hand argument will not affect the result, whereas they would have affected the positions of the lexemes in the right-hand argument if textual concatenation were used.)
One advantage of using concatenation in the vector form, rather than concatenating text before applying to_tsvector, is that you can use different configurations to parse different sections of the document. Also, because the setweight function marks all lexemes of the given vector the same way, it is necessary to parse the text and do setweight before concatenating if you want to label different parts of the document with different weights.
Thus this query
select 'a:1 b:2'::tsvector || 'a:1 c:2 b:3'::tsvector;
will result in 'a':1,3 'b':2,5 'c':4
Please advice is there a way to merge several tsvectors while preserving original positions (something similar to this):
select concat_with_preserving('a:1 b:2'::tsvector, 'a:1 c:2 b:3'::tsvector);
so it is equal to 'a':1 'b':2,3 'c':2, eg same positions deduplicated and different positions are just merged (w/o offset).
Thanks!
Convert then to text, then concatenate them with spaces between, then convert them back.
(a::text || ' ' || b::text)::tsvector

Perl, Compare and calculate the occurance of intersection between 2 arrays.

assume the following situations:
I have two arrays: array1 and array2; both holding very large number of elements inside. There can be intersection element between these two arrays and inside each array, the elements can be either unique or duplicated. Now that I want to calculate the number of occurance for all those intersection elements. I know that I can use nested loop to traverse and compare each element inside both array, but see, since each of them is holding a large number of elements, the run speed is going to be terrible. I need to run this program frequently, so is there any faster way to achieve same purpose? Thanks a lot!
You no need using nested loop. Just one for loop is enough to solve your problem. Below is the example but i not sure how you want to pass the array into scripts so i just put as your array1.
use strict;
use warnings;
my $i = 0;
my #array1 = "your array1";
my #array2 = "your array2";
for($i=0;$i<=$#array1;$i++){
my $element_in_array1 = $array1[$i];
my #occurrence = grep=/$element_in_array1/, #array2;
print " This element $element_in_array1 occur in array2 %d time\n", scalar(#occurence);
}

Minizinc, counting occurrences in array of pairs

I'm new to constraint programming and toying around with some basic operations. I want to count the number of occurrences of an arbitrary element x in an array of pairs.
For instance, the following array has 2 eights, and 1 of every other element.
sampleArray = [{8,13}, {21,34}, {8,55}]
I wonder how I am to extract this information, possibly using built-in functions.
I'm not sure I understand exactly what you want to do here. Do you want to count only the first element in the pair?
Note that the example you show is an array of sets, not a 2 dimensional matrix. Extracting and count the first(?) element in each pair is probably easier if you have a two dimensional matrix (constructed with array2d).
In general there are at least two global constraints that you can use for this: "count" and perhaps also "global_cardinality". See http://www.minizinc.org/2.0/doc-lib/doc-globals-counting.html

Matlab, index from starting location to last index

Say you have an array, data, of unknown length. Is there a shorter method to get elements form a starting index to the end than
subdata = data(2:length(data))
You can use end notation to indicate the last element. data(2:end) returns a vector containing elements in the vector data from element 2 to the last element. Or if data is a character array, it returns the second character all the way to the last character. And data(end) returns the last element.
This can be done with matrices too, i.e. data(2:end,5:end). Additionally you can use it as an operand, i.e. data(2:end-1) , data(2:end/2).
In this context, end serves a different purpose from its use at the end of functions/loops/switches.