#include <stdio.h>
#include <stdlib.h>
int main()
{
int M = 3;
int N = 6;
double A[3][6] = {{2, 5, -1, 9, -3, 6}, {7, 4, 2, 4, 2, 10}, {3, -2, -10, 1, 4, 2}};
if (M>=N)
{
printf("Row Size M should be smaller than Column Size N\nCannot hankelize this matrix\nPlease update M and N values\n"); }
else
{
double *hankel_vals
= (double *) malloc((M
+N
-2) * sizeof (double)); if (hankel_vals==NULL)
{
}
else
{
// There are M+N-2 range of possible values in the Hankelized matrix
// Precalculate them for assignment at appropriate places in the next step
// This will prevent recalculating same value multiple times
for (unsigned int sum_ind=0; sum_ind<=(M+N-2); sum_ind++)
{
int i = (sum_ind < N) ? 0 : (sum_ind - N + 1) ;
int j = (sum_ind < N) ? sum_ind : (N-1);
hankel_vals[sum_ind] = 0;
// Calculate SUM
while ((j>=0)&&(i<M))
{
hankel_vals[sum_ind] += A[i++][j--];
}
printf("hankel_vals[sum_ind] : %f\n",hankel_vals
[sum_ind
]);
// Calculate Average
if (sum_ind<M)
{
hankel_vals[sum_ind] = hankel_vals[sum_ind]/(sum_ind+1);
}
else if ( (M+N-2-sum_ind) < M )
{
hankel_vals[sum_ind] = hankel_vals[sum_ind]/(M+N-2-sum_ind+1);
}
else
{
hankel_vals[sum_ind] = hankel_vals[sum_ind]/M;
}
}
// Set and print values of each element of A with appropriate value calculated above
for (unsigned int i=0; i<M; i++)
{
for (unsigned int j=0; j<N; j++)
{
A[i][j] = hankel_vals[i+j];
}
}
//free(hankel_vals);
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmludCBtYWluKCkKewogICBpbnQgTSA9IDM7CiAgIGludCBOID0gNjsgIAogICBkb3VibGUgQVszXVs2XSA9IHt7MiwgNSwgLTEsIDksIC0zLCA2fSwgezcsIDQsIDIsIDQsIDIsIDEwfSwgezMsIC0yLCAtMTAsIDEsIDQsIDJ9fTsKCiAgIGlmIChNPj1OKQogICB7CiAgICAgICBwcmludGYoIlJvdyBTaXplIE0gc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBDb2x1bW4gU2l6ZSBOXG5DYW5ub3QgaGFua2VsaXplIHRoaXMgbWF0cml4XG5QbGVhc2UgdXBkYXRlIE0gYW5kIE4gdmFsdWVzXG4iKTsgCiAgIH0KICAgZWxzZQogICB7CiAgICAgICBkb3VibGUgKmhhbmtlbF92YWxzID0gKGRvdWJsZSAqKSBtYWxsb2MoKE0rTi0yKSAqIHNpemVvZiAoZG91YmxlKSk7CiAgICAgICBpZiAoaGFua2VsX3ZhbHM9PU5VTEwpCiAgICAgICB7CiAgICAgICAgICAgcHJpbnRmKCIgT3V0IG9mIG1lbW9yeSBcbiIpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAgICAvLyBUaGVyZSBhcmUgTStOLTIgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzIGluIHRoZSBIYW5rZWxpemVkIG1hdHJpeAogICAgICAgICAgICAvLyBQcmVjYWxjdWxhdGUgdGhlbSBmb3IgYXNzaWdubWVudCBhdCBhcHByb3ByaWF0ZSBwbGFjZXMgaW4gdGhlIG5leHQgc3RlcAogICAgICAgICAgICAvLyBUaGlzIHdpbGwgcHJldmVudCByZWNhbGN1bGF0aW5nIHNhbWUgdmFsdWUgbXVsdGlwbGUgdGltZXMKICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgc3VtX2luZD0wOyBzdW1faW5kPD0oTStOLTIpOyBzdW1faW5kKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBpICAgICAgICAgICAgICAgID0gKHN1bV9pbmQgPCBOKSA/IDAgICAgICAgOiAoc3VtX2luZCAtIE4gKyAxKSA7CiAgICAgICAgICAgICAgICBpbnQgaiAgICAgICAgICAgICAgICA9IChzdW1faW5kIDwgTikgPyBzdW1faW5kIDogKE4tMSk7CiAgICAgICAgICAgICAgICBoYW5rZWxfdmFsc1tzdW1faW5kXSA9IDA7CiAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgU1VNCiAgICAgICAgICAgICAgICB3aGlsZSAoKGo+PTApJiYoaTxNKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBoYW5rZWxfdmFsc1tzdW1faW5kXSArPSBBW2krK11bai0tXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByaW50ZigiaGFua2VsX3ZhbHNbc3VtX2luZF0gOiAlZlxuIixoYW5rZWxfdmFsc1tzdW1faW5kXSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBBdmVyYWdlCiAgICAgICAgICAgICAgICBpZiAoc3VtX2luZDxNKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgaGFua2VsX3ZhbHNbc3VtX2luZF0gPSBoYW5rZWxfdmFsc1tzdW1faW5kXS8oc3VtX2luZCsxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTStOLTItc3VtX2luZCkgPCBNICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBoYW5rZWxfdmFsc1tzdW1faW5kXSA9IGhhbmtlbF92YWxzW3N1bV9pbmRdLyhNK04tMi1zdW1faW5kKzEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGhhbmtlbF92YWxzW3N1bV9pbmRdID0gaGFua2VsX3ZhbHNbc3VtX2luZF0vTTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgCiAgICAgICAgICAgIC8vIFNldCAgYW5kIHByaW50IHZhbHVlcyBvZiBlYWNoIGVsZW1lbnQgb2YgQSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlIGNhbGN1bGF0ZWQgYWJvdmUKICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPE07IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaj0wOyBqPE47IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBW2ldW2pdID0gaGFua2VsX3ZhbHNbaStqXTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAlZiAiLEFbaV1bal0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZnJlZShoYW5rZWxfdmFscyk7ICAKICAgICAgIH0KICAgfQogICByZXR1cm4gMDsKfQ==